home *** CD-ROM | disk | FTP | other *** search
/ By Popular Request 2.0 / By Popular Request 2.0 (Arsenal Computer).ISO / amiga_3 / dsctv17b.lha / document / DisectV1.7.doc next >
Text File  |  1995-03-20  |  111KB  |  2,358 lines

  1. * ------------------------------------------------------------------------- *
  2.  
  3.         Disect V1.7 - ⌐ DMA 1994-5    26.11.94
  4.         ==========================    ========
  5.  
  6.  1) Introduction
  7.  2) Disect Request Windows
  8.  3) The Program Screen
  9.  
  10.  4) A Disassembler Tutorial
  11.  5) Symbol Selection Window
  12.  6) Address Functions
  13.  7) DataStrings
  14.  8) Key Macros
  15.  9) Expressions
  16.  
  17. 10) MultiBin Files
  18.  
  19. 11) Screen Icons Reference
  20. 12) Keyboard Reference
  21. 13) Mouse Reference
  22. 14) Menu Reference
  23.  
  24. 15) Process Variables Memory
  25. 16) Grabbing An Existing Process
  26. 17) Auto Trace Mode
  27.  
  28. 18) Hardware Monitor
  29.  
  30. 19) 68020 Modes/Instructions
  31.  
  32. 20) Installing To Hard Drive
  33.  
  34. 21) Contact Address
  35.  
  36. * ------------------------------------------------------------------------- *
  37.  
  38. 1) Introduction
  39. ===============
  40.  
  41.     Disect is a very powerful combined disassembler/debugger program,
  42. which has been designed to be easy to use. Its power is achieved at the
  43. expense of memory: the minimum requirement is 1Mb; for larger projects, 2Mb
  44. will be required. The programmer neither encourages nor condones its use to
  45. assist in illegal duplication of copyright software. Disect can be used for
  46. two main purposes: development of software; and the gaining of knowledge
  47. (hacking can be very educational).
  48.  
  49.     The debugger allows an executable file, a disk boot-block, a
  50. binary file, or an area of memory to be loaded and created as a Process. It
  51. is even possible to grab an existing memory-resident Process. A Process's
  52. instructions can be executed individually, or the Process can be activated,
  53. with or without breakpoints installed. System exceptions can be trapped
  54. before they crash the machine, and program symbols can be read from execut-
  55. able files.
  56.  
  57.     The disassembler allows a loaded program to be commented, have
  58. blank lines inserted, and have it's numbers and addresses replaced with
  59. constant or program symbols. All the symbols of Release 3 of the system
  60. include files are available to the disassembler. A program which has been
  61. dissected in this way can then be saved as two source files: a program file,
  62. and a support file. The support file will contain EQUs for all required
  63. constant symbols. System constant symbols can be EQUs (grouped by the SI file
  64. where they live), or alternatively the support file can INCLUDE all required
  65. SI files. Disect data files can be saved, to be reloaded later: 'hold on to
  66. your hacks'!
  67.  
  68.     Disect requires Release 2 of the Amiga operating system; it also
  69. requires the ASL library, and GadTools library.
  70.  
  71.     If you've paid your shareware fee then you'll have the full
  72. version. Otherwise, the copy you've got is (hopefully) only a demo. This
  73. has a few differences: you cannot disassemble to file; you cannot extract
  74. program symbols from executable files; auto trace mode is not available.
  75. In addition, you will not have all of the system symbol data files. If this
  76. is so, and since, as I don't doubt, you'll be impressed by this program, then
  77. don't hesitate in registering today, by sending your name and full address
  78. (and a cheque/postal order for ú20) to the address which you'll find at the
  79. end of this file. As well as receiving the full version, you'll also be en-
  80. titled to technical support (by mail) if required. If you like this program,
  81. it's well worth the money... this will encourage further versions, which will
  82. only get even more powerful... imagine!
  83.  
  84.     'Disect' is Shareware, Copyright ⌐ D.M.Alderson 1994/5, all
  85. rights reserved. Duplication for the purpose of backups is permitted, but
  86. not for the purpose of selling or otherwise distributing the software,
  87. manual, or other related items, which includes '.dsct' data files only for
  88. commercial purposes, without written permission from the author. This does
  89. not apply to the demo version of the software, which in such instances would
  90. include the manual, and other related items, but not including '.dsct' data
  91. files unless for commercial purposes.
  92.  
  93.     The author does not make any warranty, express or implied, with
  94. respect to the software or any related item, their quality, performance, or
  95. fitness for any purpose. It is the responsibility solely of the purchaser
  96. to determine the suitability of the software for any purpose. In no event
  97. will the author be liable for incidental or consequential damages of any kind
  98. in connection with the software product, manual, or other related items and
  99. processes including, but not limited to, any interruption of service, loss of
  100. business, anticipated profit, or other consequential damages. ETC.
  101.  
  102.     Disect was written using a 2 meg A500+ (without a hard drive!).
  103.  
  104. * ------------------------------------------------------------------------- *
  105.  
  106. 2) Disect Request Windows
  107. =========================
  108.  
  109.     The program takes much of its input through 'request windows'.
  110. These are standard windows containing string and button gadgets, etc. The
  111. more commonly used windows have keyboard shortcuts. Where available, these
  112. consist of the first letter of the text within the gadget (which will be
  113. underlined). One exception is the 'Select Address Base' request: to select
  114. '+ Decimal' you use key 'p'; to select '- Decimal' you use key 'm'.
  115.  
  116.     Many of the windows allow specification of a number of address
  117. ranges (eg: when searching memory). These contain a list of the currently
  118. defined address ranges, and two string gadgets to input the start and end
  119. addresses (inclusive) of a range. You should input the start, and then the
  120. end, after which, if the range is ok, the address range will be stored. Note
  121. that you may not enter zero as an address. For most of the windows, the
  122. ranges list will be initialised to contain the start and end addresses of
  123. any loaded project memory. If you LMB on any address range, it will be
  124. selected, and can then be changed. If you select a range, then enter no
  125. input for the start and end addresses, the range will be deleted from the
  126. list. The RMB can be pressed to un-select a selected address range.
  127.     Instead of having to enter the actual end address into any end
  128. address string gadget, it is possible to instead enter the size of a memory
  129. area, by preceeding it with a comma. You can also enter, for example: '+12',
  130. which will result in an address range of 13 bytes (ie: end address = start
  131. address + 12). For an address range of a single byte, you can simply enter
  132. '='.
  133.  
  134.     One last thing: if Disect seems to lock-up, try pressing any
  135. SHIFT key, or any ALT key.
  136.  
  137. * ------------------------------------------------------------------------- *
  138.  
  139. 3) The Program Screen
  140. =====================
  141.  
  142.     As of V1.2, Disect incorporates menus for most functions. To
  143. prevent contention between menus, and Disect's use of the RMB, in order
  144. to select from a menu, you must first RMB click on the menu bar, in order
  145. to 'activate' the menus. To disable the menus, and allow Disect to respond
  146. to the RMB in the main window, you simply LMB on the window, away from the
  147. menu bar (for example, on the status/message area).    
  148.  
  149.     At the top of the screen is displayed the available chip and
  150. fast memory, various function icons, and the program's status/message output.
  151. The status message consists of the current state of any Process (--- none,
  152. -S- Process suspended, -A- Process active, -W- Process Wait()ing), info of
  153. any defined disassembly window markers, and the number of address stack
  154. entries. The icons (from left to right) are: project; INCBIN; address stack
  155. (3 icons); smiley; workbench screen; disassembly window left/right scroll
  156. arrows. See below for more info.
  157.  
  158.     Below this is the disassembly window area. There can be either
  159. one or two disassembly windows open at once: the tab key will toggle between
  160. single and double window mode. The cursor keys can be used to scroll windows,
  161. while pressing shift also will move a window faster. In double window mode,
  162. pressing the left alt key will select the lower disassembly window. This
  163. applies to the cursor keys as well as other disassembly window keys (eg: A,
  164. F1-F9, F10).
  165.     In each disassembly window, you'll find up and down arrow gadgets
  166. for scrolling the window. Normally, these work upon the window in which they
  167. are situated. It is possible, however, to use either pair of arrow gadgets
  168. to scroll the memory window, by also pressing the right ALT key.
  169.  
  170.     Next down is a window which displays the PC and SR values, and
  171. the source effective address (SEA) and destination effective address (DEA) of
  172. the instruction at the PC, when applicable. Also displayed is the content
  173. of these addresses. There are two lines of this: the upper line displays
  174. the current values, while the lower line displays the previous values. This
  175. allows the SEA/DEA content to be seen to be affected after execution of an
  176. instruction, which is not possible with programs which display only the
  177. current values. The upper line can be used to enter new values for the PC
  178. and SR, via LMB on the digits of the PC, or the digits/letters of the SR.
  179. To enter a new SR value, a request window will be opened. This allows input
  180. of either an expression (denary/hex/binary/symbols), or any combination of
  181. the letters XNZVC to denote which flags are to be set: any unspecified flags
  182. will be cleared. If no input is received, then the PC/SR is unaffected. If
  183. the Process is active, then attempting to change the PC or SR will have no
  184. actual effect.
  185.     The third line in this window is the 'register zoom'. This can
  186. be locked to any of the registers d0-d7 or a0-a7, and displays the register
  187. content, and the content of this address and the next 15 bytes upward in
  188. memory, as denary/hex (depending on the currently selected base), and as
  189. ascii characters. The '╖' character is displayed for any bytes not within
  190. the ascii range of 32 to 127. The locked register is selected by LMB on the
  191. text of 'd0', 'd1', etc in the register window. The register zoom can also
  192. be locked to the SEA or DEA of the instruction at the PC, if a Process has
  193. been created, by LMB on the text of 'sea=' or 'dea=' in the first line of the
  194. window.
  195.  
  196.     The register window is the lower-left window on the screen, and
  197. this displays the register values as denary/hex. For data registers, the
  198. register content is displayed also as ascii. For address registers, the
  199. register content is also used as an address; the content of this is displayed
  200. as denary/hex and ascii. Any of the registers can be given new values in the
  201. same way as the PC, by LMB on the digits of the register value. A nice little
  202. feature which you may at times find useful is, when entering for an address
  203. register value, instead of an address, you may enter, for example:
  204.  
  205.         >a text string
  206.  
  207. This has the effect of storing all the input text after the '>' character,
  208. and setting the address register to point to the stored text. Disect contains
  209. eight such text buffers, each of which may contain up to 63 characters.
  210.  
  211.     The lower-right window is the memory dump. This can be scrolled
  212. using cursor keys and the right alt key. The shift key applies for the up
  213. and down cursor keys as it does for the disassembly window. By LMB on the
  214. address digits, you can input a new address for any of the separate lines in
  215. the window. When you do this, the addresses of any lines below the affected
  216. one will be updated, but any above it will remain unchanged. This allows, for
  217. example, the first line to be locked on one memory location, the second to be
  218. locked on another, and the remaining six lines to be used as a memory dump
  219. starting from yet another address. If you use the cursor keys to move the
  220. window, the first two lines will stay where they are in memory, and only the
  221. continuous block of six lines will be moved. Neat eh? Note that a much bigger
  222. memory dump window can be accessed by pressing 'm'.
  223.  
  224. * ------------------------------------------------------------------------- *
  225.  
  226. 4) A Disassembler Tutorial
  227. ==========================
  228.  
  229.     The best way to understand something is to do it, so on the disk
  230. you'll find an executable file called 'KeepASL' (in the Tutorial drawer).
  231. This is a little utility I wrote ages ago since I was fed up with having to
  232. reload the ASL after each time I assembled something. All it does is to open
  233. the ASL library and the clipboard device, preventing them from being removed
  234. from memory. So, load up Disect, and LMB on the project icon. This will open
  235. the project request from which you should select 'Executable', and select the
  236. file via the ASL.
  237.  
  238.     The next request allows you to define whether or not to create a
  239. Process, and extract any symbols from the executable file. Leave these un-
  240. checked (you don't need to create a Process for the disassembler, and there
  241. are no symbols in 'KeepASL'). The string gadget allows you to enter any CLI
  242. arguments to be passed to the executable file (again, not required now). So,
  243. just LMB on 'OK'.
  244.  
  245.     The executable will be loaded, and the disassembly window moved
  246. to it's start address. Note that marker 9 will be defined at the address -
  247. marker 9 is always defined at the start address of any loaded executable/
  248. binary/boot, etc. When you load a binary file, marker 8 will be defined at
  249. its end address, so if you were to save the binary file later, you could
  250. enter 'm9' for the save binary start address, and 'm8' for the end address.
  251.  
  252.     Next, if you haven't already done so, load the SysSymbol data for
  253. the following directories: DOS, EXEC, INTUITION. This is done by pressing the
  254. 'Help' key to access the 'Resident SysSymbol Data Preferences', selecting the
  255. required data, then 'Use'. This request also allows you to load and save the
  256. preferences, or to quit, which will restore the preferences to the state they
  257. were when you pressed 'Help'.
  258.  
  259.     In the disassembly window, you'll have something like this:
  260.  
  261. 0000665256        move.l    4.w,665604
  262. 0000665264        bsr.w    665504
  263. 0000665268        lea.l    665766(pc),a1
  264. 0000665272        moveq.l    #0,d0
  265. 0000665274        movea.l    665604(pc),a6
  266. 0000665278        jsr    -552(a6)
  267. 0000665282        move.l    d0,665608
  268. 0000665288        beq.w    665406
  269. 0000665292        lea.l    665784(pc),a1
  270. 0000665296        moveq.l    #0,d0
  271. 0000665298        movea.l    665604(pc),a6
  272. 0000665302        jsr    -552(a6)
  273. 0000665306        move.l    d0,665612
  274.  
  275. Obviously, the addresses will be different but the methods are the same.
  276.  
  277.     First of all, LMB on the area between the address and the mnem-
  278. onic of the first line, and enter the text 'main'. From the request window,
  279. select 'Instruction'. This will define a program symbol for the first address
  280. of the program, and will log the address as an instruction. Incidentally, if
  281. you ever enter a program symbol name which does not fit into the available
  282. area, the end of the name will not be lost. On the screen, only the first 11
  283. characters will be visible; when you disassemble to a file, the whole of the
  284. name will be output.
  285.  
  286.     Now, LMB on the destination effective address of the first line.
  287. This will open the symbol selection window (see below for specific info).
  288. Activate the string gadget which presently contains the LMB'd address, and
  289. enter the text 'sys_base'. From the request windows which open, you should
  290. define the address type as 'Variable', the address size as 'Long', and the
  291. address base as '+ Decimal'. What this does is to log the DEA of the first
  292. instruction as a long variable, the content of which will be displayed as
  293. positive (unsigned) denary. Just to make sure, RMB on the DEA of the first
  294. line, and you'll see:
  295.  
  296. 0000665604    sys_base    DC.L    0
  297.  
  298. The previous disassembly window address will have been stacked (look at the
  299. status message), so you can return there either by LMB on the third icon
  300. from the left at the top of the screen, or by pressing F10. Do this now!
  301.  
  302.     You'll notice that as well as having replaced the DEA of the
  303. first line with the program symbol 'sys_base', Disect will also have replaced
  304. all other references to this address. This feature can be disabled by press-
  305. ing 'Del', and unchecking 'AutoSymbol', BUT DON'T DO THIS NOW!
  306.  
  307.     Now, to make the source more readable, we'll add a blank line
  308. after each of the following lines in the disassembly window: the first, the
  309. second, and the eighth line. Do this by LMB on the mnemonic of each of these
  310. lines. This will open the 'Address Functions' request, from which you should
  311. select 'Add Blank Line' (at lower-left of window). For the second and eighth
  312. lines, you'll get the 'Address Type' request, since these addresses have not
  313. yet been logged - obviously, these should be logged as instruction addresses.
  314. This will result in the following:
  315.  
  316. 0000665256    main    move.l    4.w,sys_base
  317.  
  318. 0000665264        bsr.w    665504
  319.  
  320. 0000665268        lea.l    665766(pc),a1
  321. 0000665272        moveq.l    #0,d0
  322. 0000665274        movea.l    sys_base(pc),a6
  323. 0000665278        jsr    -552(a6)
  324. 0000665282        move.l    d0,665608
  325. 0000665288        beq.w    665406
  326.  
  327. 0000665292        lea.l    665784(pc),a1
  328. 0000665296        moveq.l    #0,d0
  329.  
  330.     Next, LMB on the text '-552' (or -$228), then on the text 'exec'
  331. in the lower window. You'll probably have guessed already, but LMB on the
  332. text '_LVOOpenLibrary' in the upper window, then select 'Confirm', and define
  333. the address as 'Instruction'. Now, we all know that a call to exec.Open-
  334. Library() requires a1 pointing to the library name text, so RMB on the SEA of
  335. the third line. What you now see won't look like much, until you've done the
  336. following: define a program symbol at the first line in the disassembly
  337. window, 'name' will do, and define the address as Data/Byte/ASCII/NULL. Now
  338. we know what library it is, we can change the program symbol from 'name' to
  339. 'int_name':
  340.  
  341. 0000665766    int_name    DC.B    "intuition.library",0
  342.  
  343.     The last request window ('Select Data Area Size') allows you to
  344. define how many bytes there are in a data area in four ways: you can enter
  345. an expression to define the number of BYTES; you can simply press 'Enter' to
  346. make it consist of one byte, one word, or one long (depending on the address
  347. size already defined); you can select 'NULL' to make the data area end at the
  348. first NULL byte/word/long; or you can select 'Symbol' to make it end at the
  349. byte before the address of the next defined program symbol.
  350.  
  351.     If you now press F10, you'll see that the address reference will
  352. have been replaced with 'int_name'.
  353.  
  354.     Next, press the 'A' key, and enter the following: '[0:$58]'. This
  355. will move the disassembly window to the $58th byte of the first hunk. Here,
  356. you will see a 'jsr' as the third line. LMB on the text '-204' or '-$cc',
  357. and replace it with '_LVOOpenWindow'. So, the first line contains the address
  358. of a NewWindow structure, so RMB on this address to move the disassembly
  359. window to this data. Now press key 'X', (or select 'Define DataString' from
  360. the 'Functions' menu), and from the list of system DataStrings, LMB on the
  361. text 'NewWindow', then select the 'Define' gadget. The NewWindow structure
  362. data area will be logged, and Disect will inform you that it has found an
  363. address pointer within the NewWindow structure, which points to an ASCII
  364. string. Click on the 'Define' gadget, and the ASCII string will also be
  365. defined as a data area. The disassembly window will now be returned to the
  366. address of the NewWindow structure. For further information about DataStrings
  367. I STRONGLY recommend that you read section 7.
  368.  
  369.     Well, we could go on like this for all of the 560 bytes of the
  370. program, but fortunately, you don't have to. Instead, LMB on the project icon
  371. and select 'Load Data', 'Erase', then load the file 'Tutorial/KeepASL.dsct':
  372.  
  373.     ; * -------------------------------------------------------------
  374.  
  375.     ; Disassembly of 'KeepASL' - DMA 1.10.94
  376.  
  377. 0000665256    main    move.l    (EXEC_BASE).w,sys_base
  378.  
  379. 0000665264        bsr.w    start_up        ; WB/CLI start up
  380.  
  381. 0000665268        lea.l    int_name(pc),a1    ; open intuition
  382. 0000665272        moveq.l    #0,d0
  383. 0000665274        movea.l    sys_base(pc),a6
  384. 0000665278        jsr    _LVOOpenLibrary(a6)
  385.  
  386. Much better than the original, eh!
  387.  
  388.     Now, we're going to disassemble the whole program to source, so
  389. press 'd'. This gives the 'Disassemble To File' request. The disassembly
  390. address range will be initialised as the address range of the loaded program.
  391. Note that with executable files, there may be more than one hunk in the file,
  392. so it is possible to disassemble more than one address range. Now, using the
  393. two string gadgets at the bottom of the window, enter the two path/file names
  394. as 'RAM:Program.s' and 'RAM:Support.s', then select either to EQU or INCLUDE
  395. system constant symbols (I suggest EQU), and select 'OK'.
  396.  
  397.     After a short time a request window will open, informing you that
  398. an immediate long has been found. This means that Disect has found a number,
  399. as immediate data, which is within the project memory range. It is possible
  400. for such numbers to be immediate data, or program addresses, but it should
  401. be fairly obvious for you to decide which from the context in which they are
  402. used. For such numbers, Disect will display any matched program symbol name,
  403. or alternatively, the previous program symbol to the address along with the
  404. required offset to match the value of the number. From this request, you have
  405. a choice of leaving the number as immediate data, replacing the number with
  406. the symbol (or symbol+offset), or quitting the disassembly process.
  407.  
  408.     In our case, the number should be replaced (it's actually the
  409. nw_Title pointer of the NewWindow structure). Ok, when it's done, load up
  410. the two source files (you'll actually find them in the Tutorial drawer,
  411. although I suggest you DO have a go at all this). Have a look at them...
  412. Nice, aren't they! AND, they'll assemble correctly.
  413.  
  414. * ------------------------------------------------------------------------- *
  415.  
  416. 5) Symbol Selection Window
  417. ==========================
  418.  
  419.     A major feature of Disect is its ability to replace numbers
  420. present within a program with symbols. Disect can distinguish between two
  421. different types of symbols:
  422.  
  423. PROGRAM    A program symbol refers to a specific address within the program.
  424.     This may be either the destination of a branch, etc, or an access
  425.     to a variable, or the address of data.
  426.  
  427.     There are two kinds of program symbol, system and user. System
  428.     program symbols, or system address symbols, are used to refer to
  429.     absolute addresses in memory, for example, the addresses of chip
  430.     registers. These form part of Disect's predefined system symbol
  431.     list. User program symbols are defined by the user, and are used
  432.     to refer to addresses within the program being disassembled.
  433.  
  434. CONSTANT    A constant symbol refers to any number used as immediate data, or
  435.     as a displacement for the following addressing modes:
  436.  
  437.     ARID    dd(ax)        ARIDI    dd(ax,rx.x)
  438.     PCD    dd(pc)        PCDI    dd(pc,rx.x)
  439.  
  440.     Disect's predefined system symbol list includes all of the system
  441.     constants of Release 3.0 of the system include files. These are
  442.     divided into three classifications:
  443.  
  444.     LVO    a library vector offset used with: jsr dd(ax)
  445.     Structure    a system structure offset used with: dd(ax)
  446.     Constant    all other system symbols
  447.  
  448.     User constant symbols are defined by the user.
  449.  
  450.     A valid symbol name must begin with either a letter, or the
  451. characters '_' or '.', and may continue with any of these, as well as digits.
  452. Disect supports the use of local program symbols, which must be prefixed
  453. with either a '_' or '.' character, depending upon the current preference
  454. setting. There are a certain number of reserved symbol names which cannot
  455. be used when defining a symbol. The list of these can be found in Section 8.
  456.  
  457.     In order to replace a number within a program, all you have to
  458. do is LMB on the number in the disassembly window. This will open the Symbol
  459. Selection Window, which is used to specify which symbol(s) are to be used to
  460. replace the number. In addition to using real symbols, Disect also allows
  461. 'fake' symbols to be created. These are symbols which have no name text.
  462. Instead, the 'name' is the value of the symbol displayed in whatever base you
  463. select. For example, instead of replacing the number 16 with the real symbol
  464. 'MP_SIGTASK', you could replace it with the fake symbol '%10000'. Or, the
  465. number 65 may be replaced with a fake symbol: "A". The possible bases for
  466. fake symbols are decimal, hex, ASCII, binary. Such symbols will appear in
  467. the symbol list where appropriate.
  468.  
  469.     Whenever you replace a number, the address where the number
  470. occurs becomes logged in the usual way. In addition, if you are replacing
  471. an address with a (new, program) symbol, then this address is also logged.
  472. Consider the following:
  473.  
  474. 632472        move.l    632804,d0
  475.  
  476.     ~    ~    ~
  477.  
  478. 632804        ori.b    #0,d0
  479.  
  480. If you LMB on the '632804' in the first line, and replace it with a symbol,
  481. eg: 'variable', then the addresses of both lines will be logged. First,
  482. Disect will allow you to define the address type for the equivalent address
  483. of '632804' (although INCBIN is not supported in this way, at present). In
  484. this example, it might be address type: VARIABLE/LONG/... This will log the
  485. second address, and assign to it a program symbol (named 'variable'). After
  486. this, the Symbol Selection window will close, and Disect will then request
  487. the characteristics of the first address (INSTRUCTION).
  488.  
  489.     The Symbol Selection window contains two list windows. The left
  490. window will display the current list of matched symbols. You may select a
  491. symbol from the list by LMB on it within this window. The right window will
  492. display either a list of system include directories, or a list of the files
  493. within a selected directory. You can LMB on a directory or file name in order
  494. to limit the symbol search to only the selected directory or file. If you RMB
  495. on a system constant symbol (in the other list), then this will select the
  496. system include directory and file which contains that symbol. Note that if
  497. you RMB anywhere else (not in the symbol list window), then the current list
  498. of symbols will be sorted alphabetically.
  499.     The currently selected system include path is displayed above the
  500. includes list window; to the right of this text is a 'Parent' gadget to un-
  501. select the current directory and file names.
  502.  
  503.     In the symbol list window, if a symbol has a '*' character disp-
  504. layed after its name, then this denotes that the symbol is not defined in
  505. the official system includes. There are quite a few of these to allow greater
  506. flexibility. They include 'FLAGB_' and 'FLAGF_' definitions of 680x0 process-
  507. or flags (in exec/execbase.i), and a complete list of raw key codes (devices/
  508. keyboard.i), as well as some hardware bits symbols. When disassembly to file,
  509. any such symbols will be output to the support file as EQUs.
  510.  
  511.     Above the symbol list window, are four gadgets. The first two
  512. gadgets allow selection of the type of symbol to be searched for. The first
  513. gadget selects between System or User symbols; the second, between Program or
  514. Constant symbols.
  515.     The third gadget allows you to select the type of search to be
  516. performed; there are two possible types of symbol search: Value, and Bit.
  517. The first will search all resident symbols for a direct value match with the
  518. number to be replaced. A Bit search will list all symbols for which a set
  519. bit in the original number corresponds to a set bit in the symbol's value.
  520. This is used when replacing a number which represents bitwise OR of multiple
  521. bit flags. As examples:
  522.  
  523.         move.l    #IDCMP_RAWKEY+IDCMP_CLOSEWINDOW,(a0)
  524.  
  525.         move.w    #DMAF_MASTER+DMAF_COPPER,dmacon(a5)
  526.  
  527. When searching for symbols in this way, when you have selected the first
  528. symbol to be used, Disect will then only list symbols which represent bits
  529. in the same group of flags (eg: only IDCMP_ flags, or only DMAF_ flags).
  530.  
  531.     The fourth gadget depends on the current symbol type: for program
  532. symbols, a 'Prev' gadget will exist; for constant symbols, an Offset cycle
  533. gadget will exist.
  534.     The 'Prev' gadget will automatically select the system/user
  535. program symbol with a value previous to that of the number being replace
  536. (which would be an address). This is useful for finding, for example, a
  537. reference to the low byte of a word variable (assuming you have already
  538. defined a program symbol for the address of the word), or a refernce into
  539. a data table. It becomes especially useful if replacing a system address:
  540. for any direct address reference to a hardware register, pressing this
  541. gadget will result in the symbol 'CUSTOM_BASE' being automatically selected
  542. (ie: address $DFF000). The apprioriate symbol from the hardware directory
  543. (custom.i) can then be selected to account for the required offset to the
  544. actual address. When you attempt to find a previous (user) program symbol,
  545. Disect will only use a local program symbol if this does not result in a
  546. reference to a local program symbol across the bounds of a global program
  547. symbol.
  548.     When searching for system/user constant symbols, the Offset cycle
  549. gadget will be displayed. This allows you to select an offset value to be
  550. used when searching for a symbol value match. The possible offsets are:
  551. -1, -2, -3, +1, +8, +16, +24. Such an offset represents the value to be added
  552. to the original search value in order to find the value to which the symbol
  553. search must match symbols. For example:
  554.  
  555.         btst.b    #INTB_AUD3,intreqr(a5)
  556.  
  557. Now, INTB_AUD3 has the value 10, ie: bit 10 of the word-register. When this
  558. is assembled (some assemblers would allow the above, some would require you
  559. to have '-8' after the 'INTB_AUD3'), the resulting code would actually be:
  560.  
  561.         btst.b    #2,$1E(a5)
  562.  
  563. So, when you LMB on the '2' in the disassembly window, obviously Disect would
  564. search for symbols of value 2. If you've already replaced the '$1E' with
  565. 'intreqr', then you'll be expecting an 'INTB_' symbol. This would return
  566. 'INTB_SOFT'. Incorrect. Hence, an offset of '+8' will solve the problem, and
  567. produce the relevant result (by searching for symbols of value 2+8, hence
  568. 'INTB_AUD3' would be found!). The actual result would, of course, be:
  569.  
  570.         btst.b    #INTB_AUD3-8,intreqr(a5)
  571.  
  572.     Above the four symbol gadgets is a string gadget which is used
  573. for displaying the current search value, or the current list of selected
  574. symbols
  575.  
  576.     Above the four symbol gadgets is a string gadget. This has a dual
  577. purpose of displaying the currently selected list of symbols which will be
  578. used to replace the number, and to allow a symbol name to be input. When
  579. searching for user program or constant symbols, you may enter any valid
  580. unused symbol name here, and this will be created as a new user symbol which
  581. will be assigned the value of the replace-number.
  582.     If you enter the name of an existing system/user symbol, then
  583. this will have the effect of selecting the symbol. In this case, the symbol
  584. search value (ie: originally the number which was being replaced), will be
  585. adjusted to take account of the value of the symbol which you entered. This
  586. is useful since there are times when a number being replaced is formed from,
  587. for example, an accumulation of structure offsets. As an example, consider a
  588. program which allocated it's variables memory dynamically, then accessed them
  589. using ARID mode via a5. Supposing this memory block was 2k in size, and you
  590. have determined that bytes 240 to 273 are used for an MP structure (message
  591. port, exec/ports.i), so you have defined a user constant symbol 'mport' to
  592. have the value 240. Now, you might find the following:
  593.  
  594.         move.b    255(a5),d0
  595.  
  596. What this represents is in fact:
  597.  
  598.         move.b    mport+MP_SIGBIT(a5),d0
  599.  
  600. This can be achieved by entering the name 'mport' (which will be selected,
  601. and the search value of 255 adjusted to 15), then selecting the 'MP_SIGBIT'
  602. symbol by LMB in the symbol list window.
  603.  
  604.     To the right of the string gadget are three check gadgets which
  605. are used to select the type of symbols to be searched for when searching for
  606. system constant symbols. These gadgets will automatically define themselves
  607. according to the context where the replace-number was used. Note that this
  608. cannot be 100% accurate for the type of symbols: always make sure you are
  609. searching for what you want!
  610.  
  611.     Whenever a symbol is selected which results in the search value
  612. becoming zero, then a request window will open. The content of this varies.
  613. If you are making a normal symbol selection (due to LMB in the disassembly
  614. window), then four gadgets will exist: 'New' 'Zero' 'Confirm' and 'Quit'.
  615. When making a dummy symbol selection (due to pressing the 'P' key in the main
  616. window), then a 'Comment' gadget will exist instead of 'Confirm'. If you are
  617. replacing a number within a bitfield instruction (ie: either the offset or
  618. width value), then you get 'New' 'Confirm' and 'Quit'.
  619.     The 'New' gadget will erase the currently selected symbol(s) and
  620. allow a new seclection to be made. 'Zero' will allow you to select further
  621. symbols (of value 0). 'Confirm' will cause the original number in the disass-
  622. embly window to be replaced with the currently selected symbol(s). 'Quit'
  623. will abort, and close the Symbol Selection window. The 'Comment' gadget has
  624. a rather useful purpose (see key 'P' in Section 12).
  625.  
  626. * ------------------------------------------------------------------------- *
  627.  
  628. 6) Address Functions
  629. ====================
  630.  
  631.     The Address Functions request is accessed via LMB on the opcode
  632. (mnemonic) area in the disassembly window. The address functions are as
  633. follows:
  634.  
  635. Log Address
  636. -----------
  637.  
  638.     This allows a program address to be logged. You will be requested
  639. the type of the address. This may be instruction, variable, data, copper,
  640. INCBIN, ASCII string (NULL-terminated), or EVEN string (which is the same,
  641. except Disect will ensure that the string ends at an odd address, so that
  642. the next address is therefore even). Note that any extra pad byte used to
  643. word-align the string must be NULL. If a Process exists, then when an address
  644. is logged (by any method), if the PC is at the address, then it will be auto-
  645. matically defined as an instruction address.
  646.  
  647. INSTRUCTION    This is the default address type for all addresses at which the
  648.     opcode can be successfully identified as a valid instruction.
  649.  
  650. VARIABLE    This allows an address to be defined as a byte, word, or long
  651.     variable. The base in which the variable's value should be
  652.     displayed can also be defined.
  653.  
  654. DATA    Similar to a variable address, a data address consists of any
  655.     number of bytes, words, or longs. The size of the data area can
  656.     be specified by either: pressing Enter (for 1 byte/word/long);
  657.     inputting an expression to determine the number of bytes of data;
  658.     selecting the NULL gadget (data continues up to and including the
  659.     first NULL byte/word/long); or selecting Symbol gadget (data area
  660.     continues until next defined program symbol). The last option
  661.     will allow a data area to automatically be adjusted if a new
  662.     program symbol is defined after the data area start, and before
  663.     what was previously the 'next program symbol'. (Note that this
  664.     cannot be used if the next logged address from the data area
  665.     start does not have a program symbol, or if there is no next
  666.     program symbol).
  667.     Incidentally, there is another way of defining data areas. See
  668.     section 7.
  669.  
  670. COPPER    A copper address will be disassembled as a macro which, when
  671.     assembled, will create the relevant copper instruction. These
  672.     macros will be output to the support source file during file
  673.     disassembly (if required). Note that for copper move instruction,
  674.     if the hardware SysSymbol data is resident then the move destin-
  675.     ation address will automatically be replaced with the relevant
  676.     symbol for the hardware register it refers to.
  677.  
  678. INCBIN    This allows data areas to be defined as INCBIN areas. Such areas
  679.     will be disassembled as an INCBIN directive. Upon selection of
  680.     this, Disect will request the INCBIN data area size, which must
  681.     be entered (no 'next-symbol', or until-NULL'). After this, the
  682.     ASL is used to select the file to which the data area should
  683.     be written. See also the section about the INCBIN request window.
  684.  
  685. AS PREVIOUS    This will automatically define an address of the same type, etc,
  686.     as the previously defined address. Be careful not to use this
  687.     after, for example, defining an address via the Symbol Selection
  688.     Window, since this would be taken as the previous address type.
  689.  
  690. Amend Address
  691. -------------
  692.  
  693.     This allows a previously-logged address to be amended.
  694.  
  695. Erase Address
  696. -------------
  697.  
  698.     This will remove anything that has been attached to the address.
  699.  
  700. Add/Erase Section Header
  701. ------------------------
  702.  
  703.     A section header is a line of '-' characters, which will be added
  704. before the address.
  705.  
  706. Add/Erase Header Comment
  707. ------------------------
  708.  
  709.     These options allow a full-line comment to be added before the
  710. address, or to be removed from the address.
  711.  
  712. Add/Erase Line Comment
  713. ----------------------
  714.  
  715.     These allow an end-of-line comment to be added to the address, or
  716. removed from the address.
  717.  
  718. Add/Erase Blank Line
  719. --------------------
  720.  
  721.     These will add/remove a blank line after the address.
  722.  
  723. Erase Program Symbol
  724. --------------------
  725.  
  726.     This allows a program symbol to be removed from the address.
  727.  
  728. Erase SEA Symbols
  729. -----------------
  730.  
  731.     This option will remove any symbol(s) which have been used to
  732. replace the instruction's source effective address. This includes the offset
  733. and width values for 68020 bit fields.
  734.  
  735. Erase DEA Symbols
  736. -----------------
  737.  
  738.     This option will remove any symbol(s) which have been used to
  739. replace the instruction's destination effective address. This includes the
  740. offset and width values for 68020 bit fields.
  741.  
  742. * ------------------------------------------------------------------------- *
  743.  
  744. 7) DataStrings
  745. ==============
  746.  
  747.     In order to log a data area which consists of a number of byte/
  748. word/long elements, ie: all bytes, all words, OR all longs, you use the
  749. address functions request. This allows you to specify the total size of the
  750. data area, and Disect will log only the first address. Obviously, this can
  751. save a lot of memory for large data areas, since Disect does not have to
  752. store information for each address. This is the best way of logging uniform
  753. data areas.
  754.  
  755.     For any data area where its elements are not all the same size
  756. (byte/word/long), you can use a DataString. The DataString request, accessed
  757. via key 'X', allows you to define your own DataString, or select a system
  758. DataString, and use it to define a data area.
  759.  
  760.     A DataString consists of two strings: the format string, and the
  761. base string. The first specifies the size of each element of a data area;
  762. 'B' represents a byte, 'W' a word, and 'L' a long. The base string defines
  763. the base of a 'piece' of data: 'P' positive denary; 'N' negative denary;
  764. 'H' hex; 'B' binary; 'A' ASCII; 'X' means use the currently selected default
  765. base (either hex or denary, as defined via the preferences). When you use
  766. a DataString to define a data area, successive addresses are logged as data,
  767. the size and base of which corresponds to the relevant characters from the
  768. format and base strings.
  769.  
  770.     Disect contains a number of predefined (system) DataStrings. The
  771. names of these correspond to the names of system structures, eg: Gadget, New-
  772. Window, etc. Each DataString represents the byte/word/long elements of the
  773. relevant system structure. You can also define your own DataStrings, which
  774. will be saved/loaded as part of the Disect data file. In the DataString
  775. request window, after pressing Enter in the base string gadget, if your
  776. DataString is valid, then it will be automatically stored. The LMB can be
  777. used to select a DataString from the currently displayed list.
  778.  
  779.     As of V1.6, when you use a system DataString to define a data
  780. area, a preference exists to allow Disect to automatically add a line comment
  781. to each 'DC.X' directive. These comments will be the names of the fields of
  782. the system structure which the DataString represents.
  783.     When you later LMB on the operand of such a 'DC.X' directive (in
  784. order to replace it with a symbol) then Disect actually uses the line comment
  785. text in order to define which system include file is to be searched within
  786. the Symbol Select window. If the required directory's SysSymbol data is not
  787. resident, Disect will attempt to load it. As well as automatically selecting
  788. which include file, Disect also defines which 'group' of bit symbols should
  789. be listed, if necessary. For example, if you LMB on the number of:
  790.  
  791.     DC.W    $44040        ; nw_IDCMPFlags
  792.  
  793. then the Symbol Select window will open in 'intuition/intuition.i', and only
  794. 'IDCMP_' flag symbols will be listed! If required, once such a number has
  795. been replaced with a symbol, Disect will automatically erase the line comment
  796. text since it is no longer required. This is a preference, and can therefore
  797. be disabled if necessary. In addition, an item exists in the 'Functions'
  798. menu which will erase ALL existing SDS (system DataString) line comments.
  799.  
  800.     When defining an data area using a system DataString, Disect can
  801. detect pointers to other system structures. For example, within a NewWindow
  802. structure, nw_FirstGadget will be detected as pointing to a Gadget structure.
  803. In this case, Disect will move the disassembly window to the address of the
  804. Gadget structure, and a request window will open which allows you to confirm
  805. to Disect that you wish the data area to be defined, or alternatively, you
  806. can cancel the definition.
  807.     The window also contains a string gadget, which will contain
  808. either the text of any existing program symbol at the start of the data area,
  809. or a symbol name which Disect will create automatically. Whichever, this is
  810. the symbol name which will be defined for the first address of the data area.
  811. It is not possible to enter any other program symbol name. For example, for a
  812. Gadget structure, Disect may create a program symbol of 'gadget0'. The number
  813. at the end of the symbol name is defined to be unique for each data area
  814. definition. It is recommended that you use these automatic symbol names
  815. (see below).
  816.     Whenever a data area is defined in this way (due to a pointer to
  817. it within a previously-defined data area), then the program symbol of it is
  818. used to replace the number/address within the existing data area. Example:
  819.  
  820.     DC.L    gadget0        ; nw_FirstGadget
  821.      ~       ~
  822.      ~       ~
  823.      ~       ~
  824. gadget0    DC.L    $13ef26        ; gg_NextGadget
  825.  
  826.     Two of the system structures which are supported by DataStrings
  827. exist as an array of structures. These are TagItem and NewMenu structures.
  828. When you define a data area for either of these structures, Disect will also
  829. define any following structures, until the end of the array. For example,
  830. a TagItem array ends when ti_Tag holds a value of TAG_END.
  831.  
  832.     One last point to mention is that when a data area is defined via
  833. a system DataString (directly from the request window, as opposed to via a
  834. pointer to it in a previously-defined data area), if the first address of the
  835. area does not have a program symbol, then Disect will automatically create
  836. one for the address, as described above. The thing to be aware of is that
  837. when disassembling to a source file, Disect has the ability to detect such
  838. program symbols, and if it does so, it will disassemble the data area using
  839. a single macro (instead of a sequence of DC.X directives). For example:
  840.  
  841. gadget1    DC.L    gadget2
  842.     DC.W    326,4,50,14
  843.     DC.W    GFLG_GADGHCOMP,GACT_RELVERIFY,GTYP_BOOLGADGET
  844.     DC.L    border12,0,intuitxt7,0,0
  845.     DC.W    2
  846.     DC.L    0
  847.  
  848. The above would automatically be converted to:
  849.  
  850. gadget1    GADGET    gadget2,326,4,50,14,GFLG_GADGHCOMP,GACT_RELVERIFY,
  851. &        GTYP_BOOLGADGET,border12,0,intuitxt7,0,0,2,0
  852.  
  853. This will not occur: if any address in the data area has a line end comment;
  854. if any address in the data area other than the first address has either a
  855. header comment, or a program symbol; or if you have not used Disect's auto-
  856. matic symbol names. The syntax for continuing macro parameters over more than
  857. one line follows that required by Devpac. Any required macro definitions
  858. will be output to the Support source file.
  859.  
  860.     As a result of this feature, any program symbol name which might
  861. be created by Disect is now reserved; this means that you cannot use these
  862. names for any other program symbols you might create. The complete list of
  863. reserved symbol names (and macro names) can be found in Section 9.
  864.  
  865.     The DataString request window contains the following:
  866.  
  867. Data Start Address
  868. ------------------
  869.  
  870.     A string gadget allows the data start address to be specified.
  871. This will be initialised, when the window opens, to be the start address of
  872. the (upper) disassembly window.
  873.  
  874. DataString Name
  875. ---------------
  876.  
  877.     A string gadget is used to enter the name of a user DataString.
  878. If you enter the name of an existing DataString, it will be selected.
  879.  
  880. Data Format String
  881. ------------------
  882.  
  883.     This string gadget allows you to enter up to 512 characters to
  884. specify the format of the data area. Each data element may be specified to
  885. be byte, word, or long, by entering the characters 'B', 'W', or 'L'. Note
  886. that if you enter, for example, 'LLBBBW', then Disect will automatically
  887. insert an extra 'B' before the 'W' to ensure word-alignment. Disect will
  888. permit an odd number of 'B' if it is at the end of the string.
  889.  
  890. Data Base String
  891. ----------------
  892.  
  893.     This string is used to enter an equal number of characters to
  894. specify the base of each data element. Each may be any of: 'P' positive den-
  895. ary; 'N' negative denary; 'H' hex; 'B' binary; or 'A' ASCII.
  896.  
  897.     Associated with each string are two numbers. The first displays
  898. the number of characters for each string. The second displays the number of
  899. successive, same, characters at the end of each string.
  900.  
  901. System/User Cycle
  902. -----------------
  903.  
  904.     This will toggle between a list of system and user DataStrings.
  905.  
  906. Delete
  907. ------
  908.  
  909.     This will delete the currently-selected user DataString.
  910.  
  911. Define
  912. ------
  913.  
  914.     This will close the window, and cause Disect to attempt to define
  915. the data area using the selected DataString. If an error occurs, the disass-
  916. embly window will be moved to the address which Disect was attempting to log
  917. when the error ocurred. Where possible, Disect will preserve any existing
  918. program symbols and comment texts within the definition data area. Any blank
  919. lines will be removed, but one will be added at the end of the data area.
  920.  
  921. Quit
  922. ----
  923.  
  924.     This will close the window, without defining the data area.
  925.  
  926. * ------------------------------------------------------------------------- *
  927.  
  928. 8) Key Macros
  929. =============
  930.  
  931.     The 'Macros' menu allows up to ten key macros to be defined and
  932. used. This allows sequences of key presses, LMB or RMB clicks, and gadget
  933. selections to be recorded, and played back automatically by pressing a
  934. single key. As an example of just how useful this can be, supposing you
  935. were dissecting a program which contained a data table of, say, a hundred
  936. entries, each one consisting of the following sort of thing:
  937.  
  938.     DC.B    "some text string",0,0
  939.     DC.L    program_function67
  940.  
  941. Before this has been logged as data, it might be disassembled as, for
  942. example:
  943.  
  944. $42be8    DC.W    $736f
  945. $42bea    blt.b    $42c51
  946. $42bec    DC.W    $2074
  947. $42bec    bcs.b    $42c68
  948.       ~       ~
  949.       ~       ~ etc
  950.  
  951. To define a key macro to format a single entry, first of all you would make
  952. sure that the disassembly window is at the start address of the first entry.
  953. You then begin the macro definition by selecting the menu item 'Macros/Begin
  954. Definition/Macro 1'. First, by LMB on the first 'DC.W', you would define the
  955. address as an 'EVEN String'. This gives:
  956.  
  957. $42be8    DC.B    "some text string",$0,$0
  958. $42bfa    ori.b    #$0,-(a0)
  959.  
  960. Next, LMB on the 'ori.b', then select 'Add Blank Line', and define this
  961. address as a single 'Data/Long/Hex' long. Finally, by clicking on the
  962. disassambly window down arrow twice, then pressing 'Enter', the macro will
  963. be defined. By moving the disassembly window down two lines, you will ensure
  964. that each time you use the macro, the relevant addresses will be formatted,
  965. since the macro has been defined to operate upon the first two lines in the
  966. disassembly window. All that is now required is to press the '1' key to use
  967. the macro to define successive entries in the data table, until the end of
  968. table is reached.
  969.     But 'ah!', I hear you say: how will I know when I have reached
  970. the end of the table? Well, one possible solution is to begin definition of
  971. macro 2, and to first of all press key '1' (which would cause the next entry
  972. in the data table to be formatted). Then, you could hold down the right ALT
  973. key whilst you LMB click once on the address digits at the left hand side of
  974. the first line in the disassembly window. This will move the memory window
  975. to this address, at which point you would press 'Enter' to complete the macro
  976. definition. All of this would give you a second macro which enables you to
  977. see the content of the next address which would be affected by the macro,
  978. before you actually use it on this address. Note that it is perfectly safe
  979. to redefine macro number 1: macro number 2 does not depend on macro number 1,
  980. even though macro number 1 was played during definition of macro number 2.
  981.  
  982.     During definition or playback of any macro, if any errors occur,
  983. then the macro definition/playback will be aborted. This would result in a
  984. macro NOT being defined. This also occurs if any Process exception occurs
  985. other than a trace or a breakpoint exception.
  986.  
  987.     A defined macro can be replayed either by pressing it's key
  988. (1-0), or using the menu item. Via the menu item, a request window will
  989. open which allows you to specify either to play the macro once, to play the
  990. macro a specific number of times, or to play the macro until an expression
  991. is TRUE. This is probably most useful for something such as the following:
  992. 'w1=$662084', which would play the macro until the (upper) disassembly
  993. window reached a certain address.
  994.  
  995.     Macro playback can be aborted by clicking on the main program
  996. window, and holding down the space bar.
  997.  
  998. * ------------------------------------------------------------------------- *
  999.  
  1000. 9) Expressions
  1001. ==============
  1002.  
  1003.     Disect allows complex expressions to be input whenever a numeric
  1004. value is required. Such expressions may contain program or constant symbols,
  1005. which may be system or user symbols, although local program symbols are not
  1006. permitted. Numbers may be expressed as denary, hex, binary, or character
  1007. constants (eg: 'a', "ab", 'abc', "abcd"). In addition, addresses can be
  1008. represented as offsets from hunk/project memory starts. For example, the
  1009. text "[0:16]" represents the address of the 16th byte of hunk 0 (the first
  1010. hunk). If there is only one project memory area (eg: an executable of only
  1011. 1 hunk, or a binary file, has been loaded), then a hunk number does not have
  1012. to be specified ("[16]" would be accepted). Any numbers within the "[]"
  1013. characters may be either hex or decimal. If a base offset address has been
  1014. defined, then if you were to input "[16]", then this would be taken as an
  1015. offset from the base offset address (instead of as an offset from the start
  1016. of the first/only hunk).
  1017.     It is also possible to prefix a number with a '.', for example:
  1018. '.$80000046'. This will cause Disect to treat the number as an FFP value,
  1019. which in this case would be evaluated to a value of 32. If the value is too
  1020. large/small to be stored as a long integer, then an error will result.
  1021.  
  1022.     Disect supports the following operators, in decreasing order of
  1023. precedence:
  1024.  
  1025. HIGH PREC    -        MINUS, eg: -32
  1026.     ~        bitwise NOT, eg: ~$0FF0
  1027.     << >>        SHIFT LEFT and RIGHT, eg: %1<<16
  1028.     & ! ^        bitwise AND, OR, EOR
  1029.     * / \        MULTIPY, DIVIDE, MODULO
  1030.     + -        ADD, SUBTRACT
  1031.     = < > <> <= >=    comparisons
  1032.  
  1033.     Precedence may be overridden via parentheses ( and ). Expressions
  1034. are evaluated left-to-right. Byte, word, and long indirection is supported
  1035. via parentheses:
  1036.  
  1037.     {4}.l        long content of address 4
  1038.  
  1039. The following is also possible:
  1040.  
  1041.     {{4}.l}.w        word content of address specified by
  1042.             long content of address 4
  1043.  
  1044.     The comparison operators return the value 0 if FALSE, and -1 (or
  1045. $FFFFFFFF) if TRUE. Expression evalution occurs using 32-bit unsigned integer
  1046. arithmetic. The operator | is equivalent to ! (bitwise OR); != may be used
  1047. for <> (inequality).
  1048.  
  1049.     There also exists a number of reserved symbol names. Unlike all
  1050. other symbols, they are case-insensitive:
  1051.  
  1052.     M1-M9    disassembly window markers 1-9
  1053.  
  1054.     W1    start address of upper/single disassembly window
  1055.     W2    start address of lower disassembly window
  1056.     W3    start address of memory window
  1057.  
  1058. If register a6 is equal to any of these, then the relevant name will be
  1059. displayed in the register window instead of the actual address:
  1060.  
  1061.     BASEEXEC    Exec library base address
  1062.     BASEDOS    DOS library base address
  1063.     BASEGFX    Graphics library base address
  1064.     BASEINT    Intuition library base address
  1065.     BASEASL    ASL library base address
  1066.     BASEGADT    GadTools library base address
  1067.     BASEMFFP    MathFFP library base address
  1068.  
  1069. The following are only valid if a Process exists:
  1070.  
  1071.     D0-D7    current value of data registers
  1072.     A0-A7    current value of address registers
  1073.     PC    current value of program counter
  1074.     SR    current value of status register
  1075.     CCR    current value of condition codes register
  1076.     SP    current value of a7
  1077.     SEA    source effective address of instruction at PC
  1078.     DEA    destination effective address of instruction at PC
  1079.  
  1080.     INITSP    value of a7 when Process initially entered
  1081.     PROCP    address of Process's Task/Process structure
  1082.  
  1083. In addition, Disect will not allow symbol names such as 'A235768', or
  1084. 'a23ff40', since such names may be automatically created during disassembly
  1085. to file, and hence should not exist already.
  1086.  
  1087.     The following lists all the symbol names reserved for creation
  1088. of automatic program symbols for system structure data areas which have been
  1089. defined via DataStrings. Each symbol name is the base name to which an ascii
  1090. number is added. All possibilities (actually, an infinite number) of each
  1091. base name text are reserved.
  1092.  
  1093. System Structure    Base Symbol        Macro Name
  1094. ----------------    -----------        ----------
  1095.  
  1096. BB        bblock        BOOTBLOCK
  1097. BitMap        bitmap        BITMAP
  1098. BoolInfo        boolinfo        BOOLINFO
  1099. Border        border        BORDER
  1100. ColorSpec        colrspec        COLORSPEC
  1101. EasyStruct        easystru        EASYSTRUCT
  1102. ExtGadget        extgadg        EXTGADGET
  1103. ExtNewScreen    extnscrn        EXTNSCREEN
  1104. ExtNewWindow    extnwind        EXTNWINDOW
  1105. Gadget        gadget        GADGET
  1106. Hook        hook        HOOK
  1107. Image        image        IMAGE
  1108. IntuiText        intuitxt        INTUITEXT
  1109. KeyMap        keymap        KEYMAP
  1110. LH        listhead        LISTHEAD
  1111. LIB        lib        LIBRARY
  1112. LN        listnode        LISTNODE
  1113. MC        memchunk        MEMCHUNK
  1114. ME        mementry        MEMENTRY
  1115. MH        memheadr        MEMHEADER
  1116. ML        memlist        MEMLIST
  1117. MLH        minlisth        MINLISTHEAD
  1118. MLN        minlistn        MINLISTNODE
  1119. MN        message        MESSAGE
  1120. MP        messport        MESSAGEPORT
  1121. Menu        menu        MENU
  1122. MenuItem        menuitem        MENUITEM
  1123. NewGadget        newgadg        NEWGADGET
  1124. NewMenu        newmenu        NEWMENU
  1125. NewScreen        newscrn        NEWSCREEN
  1126. NewWindow        newwind        NEWWINDOW
  1127. PropInfo        propinfo        PROPINFO
  1128. StringExtend    strextnd        STREXTEND
  1129. StringInfo        strinfo        STRINFO
  1130. TTextAttr        ttxtattr        TAGTEXTATTR
  1131. TagItem        tagitem        TAGITEM
  1132. TextAttr        textattr        TEXTATTR
  1133. TextFont        textfont        TEXTFONT
  1134. TextFontExtension    tfontext        TEXTFONTEXT
  1135.  
  1136. * ------------------------------------------------------------------------- *
  1137.  
  1138. 10) MultiBin Files
  1139. ==================
  1140.  
  1141.     The 'Save MultiBin' item in the 'Project' menu allows a single
  1142. binary file to be created which consists of more than one block of memory.
  1143. The item will open a request window which contains a list of entered address
  1144. ranges, string gadgets for entering address ranges, and a couple of gadgets
  1145. at the bottom of the window.
  1146.     The 'SegList' gadget allows a memory-resident SegList to be
  1147. used to automatically define the address ranges to be saved. By entering
  1148. the start address of the first hunk in memory into the string gadget next
  1149. to the 'SegList' gadget, and then clicking on the 'SegList' gadget, Disect
  1150. will scan the SegList, and store the start and end addresses of each hunk
  1151. in the SegList. Be careful! The address to be entered as the start address
  1152. of the first hunk should be the address at which the PC begins when the
  1153. SegList is executed (the SegList is immediately before this address in
  1154. memory).
  1155.     There is also a check gadget which will force the file which is
  1156. saved to be pure binary. In general, if you have used the 'SegList' gadget,
  1157. then this should be unchecked, since extra information is saved in the file
  1158. which enables the MultiBin file ('.mbin') to be reloaded later to the same
  1159. addresses from which each block of memory was saved, and possibly created as
  1160. a Process. This is of most use when dissecting an executable which allocates
  1161. memory, into which it decompresses the real program as a complete SegList.
  1162. By specifying the initial execution address of the first decompressed hunk,
  1163. the complete program can be saved as a MultiBin file. For those who are
  1164. interested, a description of the MultBin file format is at the end of this
  1165. section.
  1166.     If the gadget is checked, then only the exact content of the
  1167. specified memory ranges is saved, as a binary file ('.bin'). This means that
  1168. the saved memory cannot be loaded back later to the exact addresses from
  1169. which each block was saved.
  1170.  
  1171.     The 'Load MultiBin' item in the Project menu allows a previously
  1172. saved MultiBin file to be loaded. This presents a request window which has
  1173. an 'Allocate Saved Memory' check gadget. If checked, then Disect will attempt
  1174. to load the MultiBin file to the exact addresses from which it was saved.
  1175. Alternatively, if unchecked, the file will be loaded to any available memory.
  1176.     A separate executable program called 'AllocMultiBin' allows the
  1177. required memory of a MultiBin file to be allocated. It should be used immed-
  1178. iately after re-booting your machine. It will open an ASL requester with
  1179. which you specify the MultiBin file to be loaded. If an error occurs, the
  1180. program will re-open this requester; if the file loads successfully, the
  1181. program will merely wait until you click on it's window's close gadget, and
  1182. will then free the memory used by the MultiBin file.
  1183.     Once the MultiBin file has been loaded, you should leave 'AMB'
  1184. in memory, and load Disect. Then select 'Load MultiBin' from the 'Project'
  1185. menu, select the same MultiBin file as was loaded by 'AMB', and check the
  1186. 'Allocate Saved Memory' gadget in the relevant request window. From this
  1187. window, click on the 'OK' gadget, and 'AMB' will automatically free the used
  1188. memory, then terminate, allowing Disect to load the MultiBin file to the
  1189. required memory.
  1190.  
  1191.     Also in the Save Multibin request window is an 'Add' gadget,
  1192. which will attempt to add a selected address range to the current project,
  1193. if the memory is available.
  1194.  
  1195. MultiBin File Format:
  1196. ---------------------
  1197.  
  1198. For each memory block:
  1199.  
  1200.     LONG    start address of memory
  1201.     LONG    end address of memory
  1202.     LONG    memory type (MEMF_ returned by Exec.TypeOfMem()
  1203.  
  1204.     followed by the memory block itself
  1205.  
  1206. File ends with 3 LONGs, all of value zero.
  1207.  
  1208. * ------------------------------------------------------------------------- *
  1209.  
  1210. 11) Screen Icons Reference
  1211. =========================
  1212.  
  1213.     Here is information about the icons at the top of the main
  1214. program screen, from left to right across it.
  1215.  
  1216. Project Icon
  1217. ------------
  1218.  
  1219.     The first icon is used to access the Project Request. This allows
  1220. the following operations:
  1221.  
  1222.     1) Executable will load an executable file. After selecting the
  1223.     file to be loaded, a request window will allow you to specify
  1224.     whether or not Disect should extract any program symbols, and
  1225.     create a Process. The window also contains a string gadget with
  1226.     which to enter any CLI arguments which are to be passed to the
  1227.     Process. If program symbols are extracted from an executable
  1228.     file, then Disect will automatically log their addresses as
  1229.     instructions, since it is not possible to determine between
  1230.     code/data/etc. All this means is that some addresses will have
  1231.     to be amended via the Address Functions request... no major
  1232.     problem.
  1233.  
  1234.     2) Memory will allow a memory area to be logged as the project.
  1235.     This feature also allows a Process to be created, the starting
  1236.     address of which will be the first address of the memory area.
  1237.     It is not possible to create a Process for a ROM memory area.
  1238.  
  1239.     3) Load Binary will allow a non-executable file to be loaded,
  1240.     with the option of creating it as a Process. In addition, you
  1241.     may specify a preferred memory address to which the binary file
  1242.     should be loaded. If you specify an address, but the memory is
  1243.     already used, then Disect will not load the binary file.
  1244.  
  1245.     4) Boot Block allows a 1024-byte disk boot block to be loaded; it
  1246.     may be created as a Process if required. The initial PC address
  1247.     will be the 12th byte of the boot block. Note that when a boot
  1248.     block is loaded, the first three longs are formatted appropriatly
  1249.     (the boot ID, checksum, and whatever the third one is?). If a
  1250.     Process is created, then Disect will pass the address of the
  1251.     trackdisk's IOEXTTD structure to the Process in a1.
  1252.  
  1253.     5) Load Data and Save Data can be used to load/save the data
  1254.     that Disect creates when you disect a loaded project. This data
  1255.     is formed when you do anything to an address within the project
  1256.     memory range (replacing numbers with symbols, creating program
  1257.     symbols, adding blank lines and comments, etc). Note that the
  1258.     current disassembly window markers are also saved/loaded.
  1259.  
  1260.     6) Save Binary allows a memory area to be saved to a file. Note
  1261.     that you can resave a loaded binary file by specifying m9 and m8
  1262.     for the start and end addresses (assuming you've not changed them
  1263.     since loading the binary file).
  1264.  
  1265.     7) Erase Data will erase any existing Disect Data.
  1266.  
  1267. Note that whenever a project is loaded, disassembly window marker 9 is auto-
  1268. matically defined at the first address of it. For binary files, marker 8 is
  1269. also defined at the last address.
  1270.  
  1271. INCBIN Icon
  1272. -----------
  1273.  
  1274.     This icon will access the INCBIN request. This allows you to
  1275. define data areas which are to be disassembled using an INCBIN assembler
  1276. directive. In order to define an area, you simply enter the start and end
  1277. addresses of the area, and, if these are valid, Disect will then ask you to
  1278. select the file to save the binary area as. If the file is written ok, then
  1279. the INCBIN area will be defined.
  1280.     You can select an existing INCBIN area by LMB in the address
  1281. ranges list window. In order to delete an INCBIN area, you select it, then
  1282. enter NULL strings for the start and end addresses (ie: empty the string
  1283. gadget, and press 'Enter'). An INCBIN area may be unselected by pressing
  1284. the RMB.
  1285.     The Save gadget is used in order to re-save, or rename, an
  1286. existing INCBIN area's binary file. This is only achieved by selecting
  1287. an INCBIN area first.
  1288.  
  1289. Address Stack Icons
  1290. -------------------
  1291.  
  1292.     The address stack is used in order to follow the flow of a prog-
  1293. ram. If the RMB is pressed over an address in the disassembly window, the
  1294. current window start address will be stacked, and the disassembly window will
  1295. be moved to the new address. The three icons are: retrieve last stacked
  1296. address, stack current disassembly window address, and delete last stacked
  1297. address. Note that if pressing left alt while RMB, the lower disassembly
  1298. window address will be stacked/changed.
  1299.  
  1300. Smiley Icon
  1301. -----------
  1302.  
  1303.     Reserved for future use...
  1304.  
  1305. WorkBench Icon
  1306. --------------
  1307.  
  1308.     This allows the workbench screen to be opened/closed.
  1309.  
  1310. Arrow Icons
  1311. -----------
  1312.  
  1313.     The upper pair of left and right arrow icons can be used to move
  1314. the upper disassembly window; the lower pair are for the lower disassembly
  1315. window (if this is open). By also pressing the right ALT key, either pair
  1316. can be used to move the memory window.
  1317.  
  1318. * ------------------------------------------------------------------------- *
  1319.  
  1320. 12) Keyboard Reference
  1321. ======================
  1322.  
  1323.     This section contains general program information, related to
  1324. the keys which invoke each feature of Disect. The complete list is below:
  1325.  
  1326. Windows    Cursor Keys        Move upper disassembly window
  1327. -------
  1328.     & LEFT ALT        Move lower disassembly window
  1329.     & RIGHT ALT        Move memory window
  1330.     & SHIFT        Move window fast
  1331.  
  1332.     A    {LEFT ALT}    Define disassembly window address
  1333.  
  1334.     F1-F9    {LEFT ALT}    Go to disassembly window marker
  1335.     SHIFT F1-F9    {LEFT ALT}    Define disassembly window marker
  1336.  
  1337.     F10    {LEFT ALT}    Retrieve last address stack entry
  1338.  
  1339.     ESCAPE        Refresh all windows
  1340.     +        Swap both disassembly window addresses
  1341.  
  1342.     \        Address/Offset display mode
  1343.     TAB        Single/double disassembly window
  1344.     QUOTE (above TAB)    Change number base (hex/decimal)
  1345.  
  1346.     Y        Move disassembly window to previous addr
  1347.     U        Move disassembly window to next address
  1348.     O        Move disassembly window after data area
  1349.  
  1350. Functions    F        Search memory
  1351. ---------    G        Continue search
  1352.     W        Fill memory
  1353.     Q        Copy memory
  1354.     S        Display symbols
  1355.     D        Disassemble to file
  1356.     I        Display information
  1357.     H        Display processor history
  1358.     M        Display memory dump
  1359.     Z        Evaluate expression
  1360.     X        DataStrings (see section 7)
  1361.     P        Dummy symbol selection
  1362.  
  1363.     DEL        Display preferences
  1364.     HELP        Display resident SysSymbol preferences
  1365.  
  1366.     ESCAPE        Abort search/disassemble to file
  1367.  
  1368. Process    E        Execute instruction (whole of JSR/BSR)
  1369. -------    T        Trace instruction (stops inside JSR/BSR)
  1370.  
  1371.     C        Breakpoint after PC & resume
  1372.     V        Breakpoint at PC DEA & resume
  1373.     N        Next instruction (without execute)
  1374.  
  1375.     K        Kill Process
  1376.     B        Define breakpoint
  1377.     L        Kill breakpoints
  1378.  
  1379.         DISASSEMBLY WINDOW ADDRESS (A)
  1380.         ==============================
  1381.  
  1382.     This opens a window through which to input the required address.
  1383. If the left alt key is pressed with the 'A' key, then the input will be used
  1384. to define the lower disassembly window address.
  1385.  
  1386.         DISASSEMBLY WINDOW MARKER (F1-F9)
  1387.         =================================
  1388.  
  1389.     With the shift key, keys F1 to F9 will define disassembly window
  1390. markers 1 to 9 at the current disassembly window address. To delete a marker,
  1391. both keys can be pressed a second time. Without the shift key, the disass-
  1392. embly window will be moved to the address of the selected marker. If the left
  1393. alt key is also pressed, then the lower disassembly window will be used.
  1394.  
  1395.         RETRIEVE STACKED ADDRESS (F10)
  1396.         ==============================
  1397.  
  1398.     Key F10 will retrieve the last stacked address and move the dis-
  1399. assembly window to it. Again, left alt can also be pressed to move the lower
  1400. disassembly window.
  1401.  
  1402.         REFRESH MAIN WINDOWS (ESCAPE)
  1403.         =============================
  1404.  
  1405.     As well as refreshing all windows in the main program screen,
  1406. the escape key will, if a Process exists, move the (upper) disassembly window
  1407. to the current PC address (if this address is not visible in a disassembly
  1408. window).
  1409.  
  1410.         MOVE TO PREVIOUS ADDRESS (Y)
  1411.         ============================
  1412.  
  1413.     This will move the disassembly window to the previous logged
  1414. address from the first logged address in the disassembly window. Left alt
  1415. will select the lower disassembly window.
  1416.  
  1417.         MOVE TO NEXT ADDRESS (U)
  1418.         ========================
  1419.  
  1420.     This will move the disassembly window to the next logged address
  1421. from the first logged address in the disassembly window. Left alt will select
  1422. the lower disassembly window.
  1423.  
  1424.         MOVE AFTER DATA AREA (O)
  1425.         ========================
  1426.  
  1427.     This will move the disassembly window to the address after the
  1428. first logged data address in the disassembly window. This is useful in order
  1429. to pass large (uniform) data areas.
  1430.  
  1431.         SEARCH MEMORY (F,G)
  1432.         ===================
  1433.  
  1434.     Key 'F' will open the Search Memory request window, with which
  1435. you can define the ranges of memory to be searched, the type of search data,
  1436. and the data to be searched for.
  1437.     At the top of the window are two string gadgets to input the
  1438. start and end addresses (inclusive) of a range. You should input the start,
  1439. and then the end, after which, if the range is ok, the address range will be
  1440. stored. Note that you may not enter zero as an address. The current ranges
  1441. are displayed in a window below these gadgets. To the right of this window
  1442. are gadgets to scroll through the list of address ranges. This list will be
  1443. initialised to contain the start and end addresses of any loaded project
  1444. memory. If you LMB on any address range, it will be selected, and can then
  1445. be changed. If you select a range, then enter no input for the start and end
  1446. addresses, the range will be deleted from the list. The RMB can be pressed to
  1447. un-select a selected address range. Note that this info applies to all other
  1448. windows where address ranges have to be specified. 
  1449.     The gadgets at the bottom of the window are used to select the
  1450. type of search. This may be byte, word, long, ASCII, or source. The string
  1451. gadget allows input of the search data. For byte/word/long, this must be a
  1452. sequence of expressions, with a comma to separate each parameter. For ASCII/
  1453. source, the text string entered is the search data. Note that ASCII will
  1454. search memory for a text string, while source will actually disassemble the
  1455. specified address ranges, and compare the resulting source with the input
  1456. text. Obviously, searching for source is slower. The case gadget allows you
  1457. to specify whether to ignore case when searching for ASCII/source. If check-
  1458. ed, then Disect will use case-sensitive search; if unchecked, then case will
  1459. be ignored.
  1460.     If searching for byte/word/long, you may enter a single '?' char-
  1461. acter instead of an expression, in order to specify that a search-element is
  1462. unknown. For example, if you entered 32,"A",?,16 for a byte search, then the
  1463. following would be successfully matched: 32,65,46,16 and 32,65,12,16... etc
  1464. When searching for ASCII/source, the '?' character may be used in the same
  1465. way. In order to specify a search for a '?' character, you must enter '??'
  1466. instead. When searching for ASCII or source, any number of spaces input as
  1467. the search data will be matched to any number of spaces (or tabs) during the
  1468. search.
  1469.     Key 'G' will continue a search which has been halted due to the
  1470. search data being found. If searching for byte/word/long or ASCII data, then
  1471. Disect will move the memory window (screen lower right) to the address where
  1472. the search data has been found. If searching for source, then the (upper)
  1473. disassembly window will be moved instead.
  1474.     Note that no checks are performed on the memory areas: if you
  1475. (accidentally?) read from hardware registers, etc, you'll probably regret it...
  1476.     An alarm sound will begin whenever the search data is found, or
  1477. when the search ends (data not found).
  1478.     In order to specify the end of an address range, it is possible
  1479. to enter the following into the 'End' string gadget:
  1480.  
  1481.     =    specifies an address range of a single byte (ie: the
  1482.         end address is the same as the start address) - most
  1483.         useful for Fill Memory (!)
  1484.  
  1485.     +X    specifies an address range of (X+1) bytes (ie: the
  1486.         end address is the start address + X; 'X' can be
  1487.         any valid expression)
  1488.  
  1489.     ,X    specifies an address range of X bytes; 'X' can be
  1490.         any valid expression
  1491.  
  1492. This is possible in all request windows which allow input of an address
  1493. range. (Search Memory/Fill Memory/Copy Memory/INCBIN/Load Memory/Save Binary/
  1494. Disassemble To File)
  1495.  
  1496.         FILL MEMORY (W)
  1497.         ===============
  1498.  
  1499.     This opens the Fill Memory request window, which is similar to
  1500. Search Memory (above). The fill data type may be byte, word, long, or ASCII.
  1501. Note that no checks are performed on the memory areas: if you (accidentally?)
  1502. write to hardware registers, etc, you'll probably regret it...
  1503.  
  1504.         COPY MEMORY (Q)
  1505.         ===============
  1506.  
  1507.     A window will open, allowing you to specify the start and end
  1508. addresses of the source memory area, and the start address of the destination
  1509. memory area. These two areas may overlap without any corruption occurring.
  1510. Note that no checks are performed on the memory areas: if you (accidentally?)
  1511. write to hardware registers, etc, you'll probably regret it...
  1512.  
  1513.         DISPLAY SYMBOLS (S)
  1514.         ===================
  1515.  
  1516.     This will open a window via which a list of all current user
  1517. symbols is displayed. At the window top is displayed the total number of
  1518. program and constant symbols. The gadgets at the bottom of the window allow
  1519. selection of whether to list program, constant, variable, or unused symbols,
  1520. and the order in which to list the symbols (either alphabetically, or by
  1521. increasing symbol value - NOTE that to resort the symbol list, you must
  1522. also press the RMB).
  1523.     The next two gadgets allow you to delete or rename a selected
  1524. symbol. A symbol may be selected by LMB on it. Once a symbol has been
  1525. deleted, it cannot be retrieved. To rename a symbol, you should select it,
  1526. press the 'Rename' gadget, enter the new name into the string gadget which
  1527. is automatically activated, then press Enter.
  1528.     There is also another gadget, 'VM'. This allows a constant symbol
  1529. to be changed to a variable symbol, and vice versa. See 'Process Variables
  1530. Memory' for more info.
  1531.     As of V1.2, if you LMB on a program symbol which has already
  1532. been selected, then the symbol window will be closed, and the (upper)
  1533. disassembly window will be moved to the address of the symbol.
  1534.     As of V1.3, if you press a letter key (with or without a shift
  1535. key), or the ".", or "_" keys, then, if the symbols have been sorted alpha-
  1536. betically, the window will move to the first symbol beginning with that
  1537. character.
  1538.  
  1539.         DISASSEMBLE TO FILE (D)
  1540.         =======================
  1541.  
  1542.     Use of this feature is described in the tutorial (above); here is
  1543. some specific information. 
  1544.  
  1545.     The disassembly process occurs in two passes. On the first pass,
  1546. Disect disassembles the required address ranges internally, creating a list
  1547. of all referenced addresses which have not had a program symbol created for
  1548. them, a list of all required system symbols, and a list of all required user
  1549. symbols. Any immediate long numbers which lie within the disassembly address
  1550. range(s) which have not been replaced by a symbol are also checked for.
  1551.     Also, during the first pass, Disect performs checks for any local
  1552. program symbol references across the bounds of a global, For example:
  1553.  
  1554.     some_sr    bsr    .do_it
  1555.         rts
  1556.     another_sr    bsr    .elsewhere
  1557.     .do_it    jsr    .miles_away
  1558.  
  1559. If any such references are found, Disect will move the upper disassembly
  1560. window to the reference of the local program symbol, and the lower window
  1561. to the address of it. Disassembly to file will be abandoned.
  1562.  
  1563.     On the second pass, the disassembly occurs again; this time the
  1564. program and support source files are created. Now, any address references for
  1565. which no program symbol exists will be have automatic symbols written for
  1566. them. For example, the following code:
  1567.  
  1568. 0000675372        lea    683208,a0
  1569.  
  1570.     ~    ~    ~
  1571.     ~    ~    ~
  1572.  
  1573. 0000683208        DC.W    10
  1574.  
  1575. would be disassembled as:
  1576.  
  1577.         lea    A683208,a0
  1578.  
  1579.     ~    ~    ~
  1580.     ~    ~    ~
  1581.  
  1582.     A683208    DC.W    10
  1583.  
  1584. After the whole disassembly is complete, there may still be some referenced
  1585. addresses which were not disassembled directly. For example:
  1586.  
  1587. 0000675372        move.w    683208,d0
  1588.  
  1589.     ~    ~    ~
  1590.     ~    ~    ~
  1591.  
  1592. 0000683206    data_table    DC.L    10
  1593. 0000683210        DC.L    20
  1594.  
  1595. Here, the first line would have been disassembled containing 'A683208', but
  1596. there would be no program symbol of this name. Instead, any missing address
  1597. references will be output to the end of the program file, by offsetting them
  1598. from the previous global program symbol. As an example, the above would create:
  1599.  
  1600. A683208    EQU    data_table+2
  1601.  
  1602.     If Disect finds a data area where all bytes are NULL, instead of
  1603. creating lots of 'DC.X 0' source, Disect will convert the source to a single
  1604. line of 'DCB.X n', where n=the required number of bytes/words/longs. This
  1605. will not occur if the first line of the data area (ie:the only logged address
  1606. of the data area) has had it's DC.X operand (a zero!) replaced with a symbol,
  1607. or if the line has a line comment.
  1608.     During disassembly to file, Disect will concatenate multiple
  1609. lines of DC.B, DC.W, or DC.L statements to form (much) fewer lines of source.
  1610.  
  1611.         DISPLAY INFORMATION (I)
  1612.         =======================
  1613.  
  1614.     The displayed information contains the number of logged program
  1615. addresses, and the number of program and constant user symbols. Below this
  1616. is displayed the address range and size of each project memory area, with the
  1617. type of the memory (C=chip, F=fast, P=public). 
  1618.  
  1619.         DISPLAY PROCESSOR HISTORY (H)
  1620.         =============================
  1621.  
  1622.     After any instruction is traced or executed (or skipped via key
  1623. 'N' - see below), or whenever an active Process reaches a breakpoint, or
  1624. whenever an exception occurs, the current processor state is stored. This
  1625. information is accessed via the processor history display. The most recent
  1626. entry is displayed in the lower window, with previous entries above. The
  1627. display of register contents is in hex, although by LMB on the digits of a
  1628. number, its value is displayed in denary in the small box in the top left of
  1629. the request window. The thing to note is that for any entry, the register
  1630. values represent the values after executing the previous instruction, while
  1631. the PC, SEA/DEA and instruction disassembly represent the next instruction
  1632. to be executed.
  1633.  
  1634.         DISPLAY MEMORY DUMP (M)
  1635.         =======================
  1636.  
  1637.     This opens a large memory dump window, the start address of which
  1638. will be initialised to the current address of the first line of the small
  1639. memory window in the main program screen. The window may be moved around
  1640. memory using the cursor keys (and the shift key to move it faster). A string
  1641. gadget in the window top left allows a new start address to be input. The
  1642. base of the address digits will be the same as the currently selected base
  1643. for the main program screen (denary or hex). Note that the ASCII display will
  1644. show the character '╖' for any memory locations for which the content is out-
  1645. side the ASCII range of 32 to 127.
  1646.     By LMB on a memory location's content, Disect will display the
  1647. denary values of the byte, word, and long starting at that address. The cycle
  1648. gadget in the window allows you to select whether to display the B/W/L as
  1649. signed or unsigned denary.
  1650.     RMB on a memory location's content will cause the Base Offset
  1651. Address to be defined at the address of the selected byte. The preferences
  1652. will also be updated to display offsets instead of addresses.
  1653.  
  1654.         EVALUATE EXPRESSION (Z)
  1655.         =======================
  1656.  
  1657.     This opens a window containing a string gadget for input of an
  1658. expression. The current string content will be evaluated whenever Enter is
  1659. pressed. Expression results are displayed as unsigned denary, signed denary
  1660. (if the sign bit is set; ie, either bit 31, bit 15, or bit 7 depending upon
  1661. whether the value is in the long, word, or byte value range - try it out with
  1662. results of 4294967295, 65535, and 255 - you'll see what I mean!), hex, ASCII,
  1663. binary, and any program symbol if one is found of the result value.
  1664.  
  1665.         DUMMY SYMBOL SELECTION (P)
  1666.         ==========================
  1667.  
  1668.     This will request a single expression, the result of which will
  1669. be passed to the Symbol Selection Window. This allows you to select symbol(s)
  1670. in the usual way, for any number, although obviously no information will be
  1671. stored about your selection. When a symbol match occurs, the window will
  1672. display the 'New', 'Zero', and 'Quit' gadgets as usual, but the 'Confirm'
  1673. gadget will be replaced with a 'Comment' gadget. If this is selected, then
  1674. the Symbol Selection window will close, and a message will appear in the
  1675. main window. By LMB on the mnemonic of an instruction within the disassembly
  1676. window, the actual text of the selected symbols can be automatically stored
  1677. as a line comment for the instruction. The comment text will automatically
  1678. have the chars "*!*" added to the end, allowing such comments to be found
  1679. in disassembled a source file, using a text editor. As an example, if a
  1680. program routine allocated temporary space for definition of a NewWindow
  1681. structure:
  1682.  
  1683.     link    a5,#-48
  1684.  
  1685. Although you cannot replace '-48' with 'nw_SIZE', by making a dummy selection
  1686. for a value of '48', the Symbol Selection window will list 'nw_SIZE'. By
  1687. selecting this, then the 'Comment' gadget, the symbol text is stored as
  1688. a comment (with a marker allowing it to be found and edited, when a source
  1689. file has been disassembled).
  1690.  
  1691.         DISPLAY PREFERENCES (DEL)
  1692.         =========================
  1693.  
  1694.     This window allows selection of program preferences. The gadgets
  1695. at the bottom of the window allow the last saved preferences to be loaded,
  1696. the current settings to be saved, the current settings to be used, and the
  1697. previous settings to be restored (ignoring any changes since window opened).
  1698. The preferences are as follows:
  1699.  
  1700. AutoSymbol    This enables/disables automatic symbol replacement. This means
  1701.     that as addresses are disassembled via display of the disassembly
  1702.     window(s), any address which has not been replaced by a program
  1703.     symbol will automatically be replaced by any program symbol which
  1704.     has a matching value. In addition, if the 'hardware' directory
  1705.     SysSymbols are resident, then any references to chip registers
  1706.     or CIA addresses will also be automatically replaced. Also, any
  1707.     instructions of the form 'jsr dd(a6)' will have their displace-
  1708.     ments replaced with _LVO symbols, if a6 contains the base address
  1709.     of any of the libraries: Exec, DOS, Graphics, Intuition, ASL,
  1710.     MathFFP, GadTools. This only occurs if a Process exists, and
  1711.     will take place whenever the instruction at the PC is a jsr.
  1712.     This preference also controls Process Variables Memory references
  1713.     symbol replacement (see elsewhere).
  1714.  
  1715. Auto 0(Ax)    This enables/disables automatic display of a '0' before '(Ax)'
  1716.     for the address-register-indirect addressing mode. This is useful
  1717.     because some assemblers will automatically optimise address-
  1718.     register-indirection-with-displacement references to ARI if the
  1719.     displacement is zero. This feature allows a '0' to be displayed
  1720.     so that it can then be replaced with a symbol (for example:
  1721.     exec/lists.i 'LH_HEAD' which has the value 0).
  1722.  
  1723. Case    This allows selection of upper or lower case for disassembly.
  1724.     Note that assembler directives will always be disassembled as
  1725.     upper case.
  1726.  
  1727. Base    This allows selection of denary or hex for disassembly.
  1728.  
  1729. A7/SP    This allows selection of 'a7' or 'sp' for disassembly.
  1730.  
  1731. Local    This allows selection of the character to prefix local program
  1732.     symbols. This may be either '.' or '_'.
  1733.  
  1734. PSymb ':'    This enables/disables automatic display of a ':' character after
  1735.     program symbols in the program symbol field of a line.
  1736.  
  1737. SAD    This enables/disables automatic display of program symbols
  1738.     instead of addresses in such places as register values, memory
  1739.     dump addresses, addresses in request windows, etc.
  1740.  
  1741. Offset    This allows addresses to be displayed as hunk/project memory
  1742.     start offsets instead. If selected, any address which lie within
  1743.     the project memory range will be displayed as, for example,
  1744.     "0:256", where 0 is the hunk number, and 256 is the offset.
  1745.     In the disassembly window, this will be enclosed in "[]" chars.
  1746.     In addition, you may define a base offset address (using an item
  1747.     from the preferences menu). If you do this, then ALL addresses,
  1748.     not just addresses in project memory range, will be displayed
  1749.     as offsets relative to the base address, eg: "-$32", or "[+146]".
  1750.     A small request window is used to define the base address. This
  1751.     contains a string gadget for input of the address, and a check
  1752.     gadget to enable/disable the current base address.
  1753.  
  1754. Comment DS    This enables/disables automatic line comments when Disect defines
  1755.     a data area using a system DataString.
  1756.  
  1757. Erase DSC    This enables/disables automatic removal of DataString-defined
  1758.     line comments after symbolic replacement of a number.
  1759.  
  1760. Blank Lines    This preference enables/disables automatic blank lines. If used,
  1761.     Disect will add blank lines after any of these instructions:
  1762.         DBcc, Bcc, JMP, JSR, RTD, RTE, RTR, RTS.
  1763.  
  1764. Process Mem    This informs Disect whether or not to install a memory monitor
  1765.     when a Process is created (not if a Process is grabbed). If one
  1766.     is installed, then when the Process terminates, a request window
  1767.     will open to list any unfreed memory allocations. Disect will
  1768.     display the start and end addresses of each memory block, as well
  1769.     as the size. Also displayed will be either: 'SELF' if the memory
  1770.     was allocated by a function within the Process; the name of the
  1771.     library containing the function which allocated the memory (if
  1772.     this can be determined); 'ROM' if the memory was allocated by a
  1773.     ROM function which could not be named as a library. If the alloc-
  1774.     ator cannot be determined, then the return address when AllocMem()
  1775.     was called will be displayed.
  1776.     The memory monitor is installed by calling Exec.SetFunction() for
  1777.     the functions AllocMem() and FreeMem(). Before doing this, Disect
  1778.     first checks the current destination addresses of their JMP inst-
  1779.     ructions (the jump table just below ExecBase). If either of these
  1780.     instructions do not jump to a ROM address, then Disect will not
  1781.     attempt to install the memory monitor. Note that it is necessary
  1782.     to install a memory monitor for certain features of the Auto
  1783.     Trace mode (see elsewhere).
  1784.  
  1785.         DISPLAY SYSSYMBOL PREFERENCES (HELP)
  1786.         ====================================
  1787.  
  1788.     As mentioned above, this window allows selection of resident
  1789. SysSymbol (system symbol) data. The four gadgets at the bottom of the window
  1790. work as for Preferences (above). Response to changing the preferences occurs
  1791. when the window is closed. Note that you cannot remove a directory's data
  1792. from memory if it is used (ie: if any of it's symbols are used by the project
  1793. in memory). The digits after each directory's name represent the size of the
  1794. data file. It's best not to load data without using it, since any resident
  1795. data is checked in such circumstances as expression evaluation, checking if
  1796. a symbol name is used already, etc.
  1797.  
  1798.         EXECUTE INSTRUCTION (E)
  1799.         =======================
  1800.  
  1801.     Only available if a Process exists, this will execute the single
  1802. instruction at the PC. Note that the whole of a JSR/BSR will be executed, ie:
  1803. the Process will be suspended at the address after the JSR/BSR instruction.
  1804. Any permanent breakpoint at the PC will be ignored.
  1805.     One small point to add is that it is possible to execute PC-
  1806. relative JSR/BSR instructions which use 68020 specific address modes, even
  1807. with a pre-68020 processor. (The reason: JSR/BSR instructions are buffered
  1808. before execution, so therefore PC-relative modes get changed to absolute-
  1809. long address mode. In the case of BSR, the instruction is changed to JSR
  1810. absolute-long, so therefore any BSR which uses an 020 mode is permitted
  1811. on a pre-68020 processor. If you didn't follow that, it does not matter...)
  1812.  
  1813.         TRACE INSTRUCTION (T)
  1814.         =====================
  1815.  
  1816.     This will trace the instruction at the PC, if a Process exists.
  1817. This means that if the instruction is a JSR/BSR, then the Process will be
  1818. suspended at the first instruction of the subroutine which is called. Any
  1819. permanent breakpoint at the PC will be ignored. In addition, if you trace
  1820. a JSR or a BSR, then any form of breakpoint at the PC is ignored.
  1821.  
  1822.         RESUME PROCESS (Process Menu)
  1823.         =============================
  1824.  
  1825.     This will activate a suspended Process, hence it and Disect will
  1826. be running 'simultaneously' (multi-tasking). Any permanent breakpoint at the
  1827. PC will be ignored during the (first) execution of the instruction there.
  1828.  
  1829.         BREAKPOINT AFTER PC (C)
  1830.         =======================
  1831.  
  1832.     This will define a stop breakpoint after the instruction at the
  1833. PC, and resume the Process. This is useful if the instruction is a DBcc/Bcc,
  1834. since an entire program loop may be executed, and the Process suspended after
  1835. the loop has been completed the required number of times. A permanent break-
  1836. point at the PC will be ignored during the (first) execution of the instruc-
  1837. tion there.
  1838.  
  1839.         BREAKPOINT AT DEA (V)
  1840.         =====================
  1841.  
  1842.     This will define a stop breakpoint at the DEA of the instruction
  1843. at the PC, and resume the Process. This, again, is useful for executing
  1844. program loops, but ones where the exit point of a loop does not sequentially
  1845. lead to the next instruction. Any permament breakpoint at the PC will be
  1846. ignored during the (first) execution of the instruction there.
  1847.  
  1848.         NEXT INSTRUCTION (N)
  1849.         ====================
  1850.  
  1851.     This will move the PC to the next instruction without executing
  1852. the current one. Any breakpoint at the PC will be ignored.
  1853.  
  1854.         KILL PROCESS (K)
  1855.         ================
  1856.  
  1857.     This will kill a suspended Process. This is achieved by changing
  1858. the Process's stack pointer to the address it was when the Process began,
  1859. moving the PC to an RTS instruction, and resuming the Process.
  1860.     Whenever a Process terminates, if any data exists, you will be
  1861. given a chance to save it before it is (automatically) erased.
  1862.  
  1863.         DEFINE BREAKPOINT (B)
  1864.         =====================
  1865.  
  1866.     This allows a breakpoint to be defined. The program requests the
  1867. address of the breakpoint, and it's type. This may be permanent, conditional,
  1868. stop, or count. Conditional breakpoints also require an expression. This will
  1869. be evaluated after input, and if no error occurs, the breakpoint will be
  1870. defined. Whenever execution of an active Process reaches a conditional break-
  1871. point, then its expression will be evaluated. If the result is not zero, then
  1872. the breakpoint is removed, and the Process suspended. If the result is FALSE
  1873. (equal to zero), then the Process is resumed. If the expression cannot be
  1874. evaluated (for example, due to an unknown symbol name), then the Process will
  1875. be suspended, with the breakpoint intact, and an error message displayed.
  1876.     Count breakpoints have associated with them a long counter. When-
  1877. ever the breakpoint is reached, the counter is decreased. If it reaches zero,
  1878. then the breakpoint is removed, and the Process suspended, otherwise the
  1879. Process will resume.
  1880.     Stop breakpoints are simple breakpoints which will cause the
  1881. Process to be suspended. They are removed whenever encountered. Stop break-
  1882. points are in fact count breakpoints with an initial counter value of 1.
  1883.     Note that an alternative method of defining a breakpoint is to
  1884. LMB on the address digits in the disassembly window, at the address where the
  1885. breakpoint is required.
  1886.  
  1887.     When an active Process reaches a breakpoint, if the breakpoint
  1888. causes the Process to be suspended, then the PC will be at the address of
  1889. the breakpoint, and the instruction there will not yet have been executed.
  1890. Whenever an exception occurs, the PC will either be at the address of the
  1891. instruction which caused it, or at the address of the next instruction.
  1892.  
  1893.         KILL BREAKPOINTS (L)
  1894.         ====================
  1895.  
  1896.     This will remove all currently-defined breakpoints. It works even
  1897. when the Process is active.
  1898.  
  1899. * ------------------------------------------------------------------------- *
  1900.  
  1901. 13) Mouse Reference
  1902. ===================
  1903.  
  1904.     This section describes the areas of the main program screen which
  1905. will respond to LMB or RMB activity.
  1906.  
  1907. Disassembly Window
  1908. ------------------
  1909.  
  1910.     1) Address Digits LMB at left of window to define breakpoint. #
  1911.     2) Address Digits RMB at left of window to remove breakpoint.
  1912.     3) Program Symbol area LMB define program symbol for the address.
  1913.     4) Program Symbol area RMB on a local moves window to its global.
  1914.     5) Mnemonic LMB to access address functions.
  1915.     6) Mnemonic RMB to move PC to instruction.
  1916.     7) Number LMB in instruction operands to replace with symbol(s).
  1917.     8) Program Address RMB in instruction operands to stack current
  1918.         address and move window to new address. *
  1919.     9) Displacement RMB in instruction operands to stack current
  1920.         address and move window to EA, eg: 32(a6). *
  1921.  
  1922. # Right ALT may also be pressed, which will move the memory window to the
  1923.   address instead of defining a breakpoint.
  1924.  
  1925. * Left ALT may also be pressed to move the lower disassembly window; right
  1926.   ALT may be pressed to move the memory window (in which case, no address
  1927.   will be stored on the address stack).
  1928.  
  1929. PC/SR/EA Window
  1930. ---------------
  1931.  
  1932.     1) PC Value Digits LMB to define new PC value.
  1933.     2) SR Value Digits/Flags Text LMB to define new SR value.
  1934.     3) SEA/DEA Text LMB to select register zoom lock.
  1935.     4) SEA/DEA Value Digits RMB to display previous program symbol.
  1936.  
  1937.  
  1938. Register Window
  1939. ---------------
  1940.  
  1941.     1) D0-D7/A0-A7 Value Digits LMB to define new register value.
  1942.     2) D0-D7/A0-A7 Text LMB to select register-zoom lock.
  1943.  
  1944. Memory Window
  1945. -------------
  1946.  
  1947.     1) Address Digits LMB to define new memory display address.
  1948.  
  1949. The following request windows also have responses to mouse buttons:
  1950.  
  1951. Memory Dump
  1952. -----------
  1953.  
  1954.     1) Memory content LMB to display byte/word/long value as denary.
  1955.     2) Memory content RMB to define base offset address.
  1956.  
  1957. Breakpoints Display
  1958. -------------------
  1959.  
  1960.     1) Breakpoint information LMB to move (upper) disassembly window.
  1961.  
  1962. Symbol Display
  1963. --------------
  1964.  
  1965.     1) Symbol name LMB (twice) to move (upper) disassembly window.
  1966.  
  1967. * ------------------------------------------------------------------------- *
  1968.  
  1969. 14) Menu Reference
  1970. ==================
  1971.  
  1972.     This section details any program functions which are accessible
  1973. only via menus (no keyboard commands), and are not documented elsewhere.
  1974.  
  1975.         SCAN '.GS' FILE (Project Menu)
  1976.         ==============================
  1977.  
  1978.     This allows a '.gs' file as produced by GenAm to be scanned, and
  1979. its constant symbols extracted. When doing this, if Disect finds a symbol
  1980. name which is already used (either by a system or a user symbol), then the
  1981. values of the two symbols are compared. If they both have the same value,
  1982. then the symbol from the '.gs' file is ignored. If the values differ, then
  1983. a request window will open, allowing you to either rename the symbol from
  1984. the '.gs' file (type in the new name, and press 'Enter'), or to ignore the
  1985. symbol from the '.gs' file (click on the 'Ignore' gadget). Note: it is best
  1986. to scan a '.gs' file ONLY AFTER you have already loaded any required system
  1987. symbols for your current project. This is because when SysSymbol data is
  1988. loaded, no checks occur for existing symbol names. When you later save your
  1989. '.DSCT' data, the symbols read from the '.gs' file will also be saved, so
  1990. you only need to scan a '.gs' file once.
  1991.  
  1992.     BREAKPOINT AT ACTIVE PROCESS PC (Process Menu)
  1993.     ==============================================
  1994.  
  1995.     This allows Disect to regain control of an active Process. In
  1996. terms of Exec task-switching, the Process will be either Wait()ing on signals
  1997. or Ready (suspended only until its next quantum). If the Process is Waiting,
  1998. then the breakpoint will be defined, but the Process will remain Waiting
  1999. until it receives a valid signal (caused by, eg: LMB on it's window), at
  2000. which point it will reach the breakpoint.
  2001.     If the Process is Ready, then the breakpoint can only be defined
  2002. if the Process's PC is within project memory range (ie: not within ROM, or a
  2003. system library, etc).
  2004.  
  2005.     DISPLAY BREAKPOINTS (Process Menu)
  2006.     ==================================
  2007.  
  2008.     This displays any defined breakpoints: the breakpoint address, 
  2009. and breakpoint type. Permanent breakpoints are denoted by '*' and conditional
  2010. by '?'. Count and stop breakpoints have a number displayed with represents
  2011. the remaining counter value (a stop breakpoint is a count breakpoint of value
  2012. 1). Conditional breakpoints have their expressions displayed after the '?'.
  2013. By LMB on a breakpoint text line, the (upper) disassembly window can be moved
  2014. to the address of the breakpoint.
  2015.  
  2016. * ------------------------------------------------------------------------- *
  2017.  
  2018. 15) Process Variables Memory
  2019. ============================
  2020.  
  2021.     As of V1.7, if a Process exists, it is possible to define an area
  2022. of memory as variables memory which is used by the Process. This memory may
  2023. be either within the Process's memory (project memory range), or it may have
  2024. been allocated by the Process. This is most useful when dissecting a program
  2025. which references its variables using either of the addressing modes ARID
  2026. (eg: '32(a4)'), or ARIDI (eg: '16(a5,d0.w)'), since it allows references
  2027. to known variables to be automatically replaced with user-defined symbols,
  2028. as will normally occur with direct address references to logged addresses.
  2029.  
  2030.     The 'Process' menu contains an item 'Variables Memory'. This
  2031. will open a request window which contains: two string gadgets for input of
  2032. variables memory start and size; a single string gadget for input of the
  2033. address of a 'JSR _LVOAllocMem(a6)' instruction; and two more gadgets, 'Ax',
  2034. and 'Previous'.
  2035.  
  2036.     The first two string gadgets allow the variables memory area to
  2037. be specified directly, if this is known. If you enter a start address and a
  2038. size which matches the address and size of any block of memory which is known
  2039. to have been allocated by the Process, then the address of the 'JSR AllocMem'
  2040. which allocated this memory will automatically be stored in the third string
  2041. gadget. It is also possible to enter the address of a 'JSR AllocMem', from
  2042. which Disect will be able to determine the address and size of the variables
  2043. memory. The 'Previous' gadget will automatically define all three string
  2044. gadgets according to the last memory allocation made by the Process. Note
  2045. that this is only possible if a memory monitor was installed when the Process
  2046. was created (see main preferences).    The 'Ax' gadget allows you to select
  2047. which address register is to be taken as a variables memory base pointer.
  2048.  
  2049.     The purpose of this is best illustrated by example. If you were
  2050. dissecting a Process which had allocated a block of memory and stored its
  2051. address in a4, or had done 'lea [1:0],a4', and you had the following:
  2052.  
  2053.     move.b    #24,32(a4)
  2054.  
  2055. If you LMB on the '32' and replace it with a user constant symbol which you
  2056. named 'some_var':
  2057.  
  2058.     move.b    #24,some_var(a4)
  2059.  
  2060.     If the DEA is within a known variables memory area, then the
  2061. symbol 'some_var' is treated as a 'variable constant symbol'. What this means
  2062. is that whenever the PC reaches any instruction which contains either an ARID
  2063. or a ARIDI reference such as '32(a4)', then Disect will automatically replace
  2064. the '32' with the known variable symbol 'some_var'.
  2065.  
  2066.     All of the information contained in the Variables Memory request
  2067. window is saved as part of the DSCT data file, so that, for example, once
  2068. the 'JSR AllocMem' which allocates the variables memory has been identified,
  2069. Disect will automatically define the variables memory start and size when
  2070. this instruction is executed the next time you load the original Process.
  2071.  
  2072. * ------------------------------------------------------------------------- *
  2073.  
  2074. 16) Grabbing An Existing Process
  2075. ================================
  2076.  
  2077.     The 'Project' menu item 'Grab Process' allows an existing memory-
  2078. resident Process to be grabbed, and used as if the Process had been created
  2079. by Disect in the normal way. A request window will open, which will list
  2080. all current Processes which are waiting, either as a result of a call to
  2081. Exec Wait(), or Exec WaitPort(). To grab a Process, simply LMB on its name
  2082. to select it, then click on the 'Grab' gadget. At this point, if the Process
  2083. is no longer Waiting, then Disect will not attempt to grab it. If the Process
  2084. is still Waiting, Disect will effectively send it one of the signal(s) it is
  2085. waiting for, and the Process will resume, under control of Disect. Lovely!
  2086.  
  2087.     Also in the 'Project' menu is another item 'Ungrab Process'. This
  2088. will allow a grabbed Process to be resumed, no longer under the control of
  2089. Disect.
  2090.  
  2091.     This feature should be used with caution. It is vital that some
  2092. Processes remain functional at all times, ie: it is not safe to grab them
  2093. since their activities must not be interrupted. The only way to discover if
  2094. a Process can be safely grabbed (and ungrabbed) is to try it. Note that some
  2095. Processes can be grabbed, and only when you attempt to ungrab them will
  2096. problems occur. You have been warned...
  2097.  
  2098.     Another word of warning: a Process which has been grabbed may
  2099. have its SegList memory (the memory in which the Process resides) freed
  2100. automatically, as soon as the Process has replied to its WorkBench start-up
  2101. message. As a result, it may be unsafe to single-step the last instructions
  2102. of a Process, since the OS may free the Process's memory before the very last
  2103. instruction has been executed by Disect. As an example:
  2104.  
  2105.     bsr    close_down    ; reply to WB message
  2106.  
  2107.     moveq.l    #0,d0    ; set return code
  2108.  
  2109.     rts        ; Process terminates here !
  2110.  
  2111. If you execute (key 'E') the bsr, the Process replies to its WB start-up
  2112. message, which may cause the Process's memory to be freed. Disect will
  2113. then have a PC at the moveq.l instruction, but any operation which uses
  2114. memory (eg: opening a Disect window) may cause the content of the PC
  2115. address to become corrupt. If this occurs, then you should select the
  2116. 'Move PC To Return Code' item from the 'Process' menu. This will move
  2117. the PC to an address which is guaranteed to contain the final two
  2118. instructions in the example above.
  2119.  
  2120. * ------------------------------------------------------------------------- *
  2121.  
  2122. 17) Auto Trace Mode
  2123. ===================
  2124.  
  2125.     Hopefully, this will at times prove to be a rather useful little
  2126. feature. What it does is to automatically trace the instructions of your
  2127. Process until some certain pre-specified condition is met. It is accessed
  2128. via the 'Process' menu, which will open a request window. This contains a
  2129. 'Resume' and a 'Quit' gadget: the first will enable auto trace mode, whilst
  2130. the second will not. Note that once enabled, auto trace mode can be disabled
  2131. be pressing the 'Esc' key. Whenever you save the main program preferences,
  2132. then the current auto trace mode settings and expressions are also saved. The
  2133. remaining content of the auto trace request window is roughly divided into
  2134. two.
  2135.  
  2136.     On the left, you have six check gadgets and two string gadgets.
  2137. These define the conditions which will cause auto trace mode to be disabled.
  2138. The first two check gadgets are used to define whether or not auto trace mode
  2139. is disabled whenever an instruction is reached which will attempt to perform
  2140. a word or long read/write using an odd source/destination effective address.
  2141. As with all the conditions which may disable auto trace mode, the Process
  2142. will 'suspend' before the current instruction has been executed.
  2143.  
  2144.     The third check gadget is used to disable auto trace mode when-
  2145. ever the instruction at the PC is RTS. This can be used to effectively
  2146. resume the Process until the RTS of the current function/subroutine. Note
  2147. that Disect will count how many JSR/BSR instructions are traced, in order
  2148. to know how many RTS instructions must be ignored before the actual RTS
  2149. which will disable auto trace mode is reached.
  2150.  
  2151.     The next check gadget, if checked, will cause auto trace mode
  2152. to be disabled whenever the destination effective address of an instruction
  2153. is not within 'permitted' memory. Disect considers the following to be
  2154. permitted:        
  2155.  
  2156.     1) The memory in which the Process resides.
  2157.     2) The memory in which the Process's Process STRUCTURE resides.
  2158.     3) The Process's stack.
  2159.     4) Memory used by the LIB structure of any resident library.
  2160.     5) Any memory allocated by the Process.
  2161.  
  2162. Any writes to memory allocated by the Process will only be detected as being
  2163. permitted if a memory monitor was installed when the Process was created (not
  2164. grabbed!). This option can be found in the Preferences request window. For
  2165. word or long writes to memory, Disect will also check if the address of the
  2166. last byte written is outside permitted memory.
  2167.  
  2168.     The final two check gadgets are used to enable/disable each
  2169. expression entered into the two string gadgets. If enabled, before tracing
  2170. an instruction, Disect will evaluate an expression, and will disable auto
  2171. trace mode if the result is TRUE (non-zero). Note that this is the equivalent
  2172. of placing a conditional breakpoint at every instruction of your Process
  2173. (which would be otherwise impossible), including any external libraries or
  2174. functions, including ROM (also not otherwise possible). If the expression
  2175. contains either of the reserved symbol names 'SEA' and/or 'DEA', then if
  2176. an instruction does not have a source/destination effective address, the
  2177. expression will be ignored (for that instruction only). As a result, Disect
  2178. will not allow a single expression to contain BOTH 'SEA' and 'DEA' (since
  2179. this would result in the expression being ignored for instructions which
  2180. have only a source OR a destination effective address). This is why there
  2181. are two expressions permitted: one can contain 'SEA', and the other, 'DEA'.
  2182.  
  2183.     The are other conditions which will always cause auto trace mode
  2184. to be disabled: if PC is 0 or odd; if the opcode at PC cannot be identified;
  2185. if the destination effective address is hardware register INTENA; if the
  2186. instruction at PC is privileged; or if a breakpoint is reached (if the
  2187. breakpoint would normally cause an active Process to be suspended).
  2188.  
  2189.     In the right of the auto trace request window are seven check
  2190. gadgets used to control various options. The first two tell Disect whether
  2191. or not to trace ROM functions, and any external functions (not within the
  2192. memory range of the Process, and not in ROM). Whenever a JSR/BSR instruction
  2193. is reached, Disect uses the address of the subroutine to decide if it should
  2194. be traced. If not, then the JSR/BSR instruction is executed, as occurs via
  2195. pressing key 'E' normally, hence the subroutine will execute in real-time.
  2196. Note that a JSR/BSR is treated as a call to a ROM function either if the
  2197. subroutine address is in ROM, or if the instruction at this address is a JMP
  2198. into ROM (eg: exec.library). If a function is not traced, then auto trace
  2199. mode will resume after the function has returned.
  2200.  
  2201.     The third check gadget will enable/disable writes to the history
  2202. buffer after each instruction has been traced. Whenever a JSR/BSR is executed
  2203. (ie: not traced), then the history buffer will be written to after the JSR/
  2204. BSR has completed, the function having returned successfully.
  2205.  
  2206.     The final four check gadgets will enable/disable the refreshing
  2207. of the four main program windows after each instruction has been traced.
  2208.  
  2209.     The second item in the Process menu is 'Resume Until RTS'. This
  2210. will enable auto-trace mode, with all options disabled except 'Suspend At
  2211. RTS'. This is useful for quickly getting to the end of the subroutine in
  2212. which the PC is currently located. Note that the 'Odd SEA' and 'Odd DEA'
  2213. options for auto trace mode will be as defined via the Auto Trace Mode
  2214. request window (ie: they are not automatically disabled during Resume Until
  2215. RTS).
  2216.  
  2217.     Also in the 'Process' menu is another item 'Breakpoint After
  2218. External BSR/JSR'. If you're not interested in this then read no further...
  2219.  
  2220.     Right, the reason I did this one was as follows: when tracing
  2221. ROM functions, more specifically exec.library Wait(), auto trace mode would
  2222. be disabled at the following instruction:
  2223.  
  2224.     move.w    #$4000,$dff09a    ; disable interrupts
  2225.  
  2226. Now, we cannot possibly expect to continue auto-trace mode (take my word for
  2227. it...), so what this menu item will do is to place a stop breakpoint at the
  2228. address after the last traced internal JSR/BSR to an external function.
  2229. What this means is that somewhere within the memory range of our Process is
  2230. the following:
  2231.  
  2232.     ~    ~    ~
  2233.     ~    ~    ~
  2234.     jsr    _LVOWait(a6)
  2235.  
  2236.     ~    ~    ~
  2237.     ~    ~    ~
  2238.  
  2239. Since this is the (internal) JSR which called an external function, Disect
  2240. will define the breakpoint immediately after this instruction, and resume
  2241. the Process. Once the Wait() has completed, the Process will be suspended
  2242. after the JSR instruction. NOTE: before using this menu item, in this
  2243. example it is necessary to move the PC to the instruction before the
  2244. 'move.w #,$dff09a' (ie: you MUST NOT use it with the PC at this instruction).
  2245. To move the PC to the previous instruction, you merely need to RMB on the
  2246. mnemonic of the instruction in the disassembly window. Remember this!
  2247.  
  2248. * ------------------------------------------------------------------------- *
  2249.  
  2250. 18) Hardware Monitor
  2251. ====================
  2252.  
  2253.     This feature is essentially unfinished, although it is usable
  2254. (with caution), so I decided to include it in the demo version of Disect
  2255. (in the hope of some constructive feedback...?)
  2256.  
  2257.     If enabled, the hardware monitor allows an active Process to
  2258. alter the values of certain hardware registers, without crashing the system
  2259. when the Process is suspended. This also applies to a Process being active
  2260. in the sense of only executing a single instruction. At present, the status
  2261. of DMA flags, interrupt flags, and ADK flags are monitored, as well as all
  2262. interrupt vectors, and all trap vectors. Support is not yet available for
  2263. any Process which alters the VBR. In addition, the TRACE and ILLEGAL vectors
  2264. must NOT be altered by the Process.
  2265.  
  2266.     Disect also allows two user-definable functions to be used, one
  2267. to be called whenever the Process is resumed, and one to be called whenever
  2268. the Process is suspended. Each is defined via its own request window, which
  2269. contains a string gadget for input of the function address, and a check
  2270. gadget which is used to enable/disable the function. A 'Load' gadget also
  2271. allows an executable file to be loaded to be used as a function.
  2272.     Also in the request window are 16 check gadgets which define
  2273. which registers must be preserved during the function, and 16 string gadgets
  2274. which allow register values to be passed to the function. If a register is
  2275. preserved, then it will be the same after the function as it was before the
  2276. function was called; any registers which are not preserved will contain the
  2277. return values from the function.
  2278.     Any enabled function will be executed in Supervisor mode. The
  2279. function must remain in Supervisor mode, and must end with an 'RTS'.
  2280.  
  2281. * ------------------------------------------------------------------------- *
  2282.  
  2283. 19) 68020 Modes/Instructions
  2284. ============================
  2285.  
  2286.     The following notes concern 68020-specific addressing modes, and
  2287. instructions:
  2288.  
  2289. 1. In a 68020 effective address, only the base displacement can be replaced
  2290. by a symbol; the outer displacement cannot. For PC-relative modes, the value
  2291. displayed for the base displacement will be the result of adding it to the
  2292. PC value for the instruction. This address will be automatically replaced by
  2293. a matching program symbol (if the current preferences permit this). For modes
  2294. where the base register is an address register, if the base displacement is
  2295. a long, then an automatic program symbol match is checked for in the same
  2296. way.
  2297.  
  2298. 2. The offset and width values for bit field instructions can be replaced by
  2299. symbols, although only a single user constant symbol is permitted. When using
  2300. the symbol selection window to replace a bit field offset/width value, the
  2301. symbol search type is pre-defined, and cannot be altered. Since these values
  2302. can be replaced by only one symbol each, the facility to enter an existing
  2303. symbol name (to be used as an offset) will be disabled.
  2304.   If you replace a bit field value, the address of the BF instruction is not
  2305. logged in the usual way. This has no other implications, except it may save
  2306. you a little memory.
  2307.  
  2308. 3. When a Process exists, during calculation of a 68020 effective address,
  2309. if any memory indirection attempts to read a non-existant address, then the
  2310. effective address will be considered invalid, and will not be displayed.
  2311. Also, if you're using a pre-68020 processor, any disassembly of 68020 modes
  2312. which attempts to perform a memory indirection at an odd address will render
  2313. the EA invalid, hence it will not be displayed.
  2314.  
  2315. 4. The following 68020 instructions are not implemented: CAS, CAS2, CALLM,
  2316. RTM, PACK, UNPK.
  2317.  
  2318. * ------------------------------------------------------------------------- *
  2319.  
  2320. 20) Installing To Hard Drive
  2321. ============================
  2322.  
  2323.     Ok, on the disk, the file 'DisectV1.7' is in fact a script. This
  2324. contains an ASSIGN:
  2325.  
  2326. ASSIGN DISECT: DisectV1.7:
  2327.  
  2328.     The last name of this may be changed to reflect the partition
  2329. name where you wish to put Disect. Other than this, NOTHING else should be
  2330. altered. Simply copy the FOUR directories and FOUR files from the (floppy)
  2331. disk to (where-ever!). Important: DO NOT give the executable ('Disect.exe')
  2332. an icon in order to double-click on it to launch the program: ALWAYS double-
  2333. click on the script file ('DisectV1.7')
  2334.  
  2335. * ------------------------------------------------------------------------- *
  2336.  
  2337. 21) Contact Address
  2338. ===================
  2339.  
  2340.     If you have any problems or suggestions concerning Disect, (or
  2341. if you want the full version), here's the address:
  2342.  
  2343.     Dave Alderson
  2344.     86, Powell Ave
  2345.     Marton
  2346.     Blackpool
  2347.     Lancashire
  2348.     England
  2349.     FY4 3HH
  2350.  
  2351.     Last, but certainly by no means least, many, many, many thanks
  2352. to Bill Westhead for helping spread the (e-mail) word, and also to the
  2353. following people for helping to test out the early versions:
  2354.  
  2355.     Marc Kelly
  2356.     Mark Manning
  2357.  
  2358. * ------------------------------------------------------------------------- *